下午温习了一下排序算法。突然感觉,过完年挺久没写代码,有点生疏,还是之前没有掌握的很牢固(以下例子都是从小到大排)。
一共有五类内部排序方法(插入排序、交换排序、选择排序、归并排序和基数排序),那现在说的直接插入排序是插入排序算法中的一类,还有一种高级的插入排序是希尔排序。本来数据结构就学得不好,希尔排序就是懵了(尽管喷吧)。直接插入排序是一种简单的插入排序算法,其基本思路是:依次把待排序的记录逐一按其关键字的大小插入到一个已经排好序的有序序列中去,直到所有的记录插完为止,得到一个新的有序序列。
直接插入排序算法思路:
代码清单:
1 void zjInsert(typedef r[],int n) 2 { 3 int i,j; 4 for(i=2;i<=n;i++) /*从第二个记录开始插入*/ 5 { 6 r[0]=r[i]; 7 j=i-1; 8 while(r[0].key<r[j].key) 9 { 10 r[j+1]=r[j]; 11 j--; 12 } 13 r[j+1]=r[0]; 14 } 15 }
交换排序:交换排序是通过两两比较待排序记录的关键值,交换不满足顺序的那些偶对,直到全部满足为止。交换排序中有两种比较常用:冒泡排序和快速排序
冒泡排序的基本思路:先将第一个记录的关键字和第二个记录的关键字进行比较,若为逆序(即r[1].key>r[2].key),则交换两个记录,然后比较第二个记录和第三个记录的关键字,若为逆序,又交换两个记录,如此下去,直至第n个记录和第n-1个记录的关键字进行比较为止,这样就完成了第一趟冒泡排序,其结果就是关键字最大的记录被安置到第n个记录的位置。然后进行第二轮冒泡排序,直至全部为顺序。
算法思路:
代码清单:
void BubbleSort(typedef r[],int n) { int i,j,k; typedef x; i=1; k=1; while((i<n)&&(k>0)) { k=0; for(j=1;j<=n-i;j++) { if(r[j+1].key<r[j].key) { k++; x=r[j]; r[j]=r[j+1]; r[j+1]=x; } i++; } } }
选择排序是指每次从待排序的记录中选出关键字值最小(或最大)的记录,顺序放在已排序的子序列的后面,直到全部排完。选择排序主要包括简单选择排序和堆排序两种。
对待排序的序列进行n-1趟扫描,第i趟扫描选出剩下的n-i+1个记录中关键字值最小的记录和第i个记录互相交换。第一次待排序的空间为r[1]~r[n],经过选择和交换后,r[1]中存放最小的记录;第二次待排序的区间为r[2]~r[n],经过选择和交换后,r[2]存放次小的记录,依次类推,最后,形成r[1..n]成为有序序列。
算法思路:
代码清单:
void jdSort(typedef r[], int n) { int i,j,k; typedef x; for(i=1;i<n;i++) { k=i; for(j=i+1;j<n;j++) { if(r[j].key<r[k].key) { k=j; } } if(i!=k) { x=r[i]; r[i]=r[k]; r[k]=x; } } }
算法与数据结构--直接插入排序算法,布布扣,bubuko.com
原文:http://www.cnblogs.com/luzuoquan/p/3594898.html