c语言各种排序法详解
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一插入排序
1.1 直接插入排序
基本思想:每次将一个待排序额记录按其关键码的大小插入到一个已经排好序的有序序列中,直到全部记录排好序。
图解:
代码实现:
[cpp]view plain copy
1.//直接顺序排序
2.void InsertSort(int r[], int n)
3.{
4.for (int i=2; i 5. { 6. r[0]=r[i]; //设置哨兵 7.for (int j=i-1; r[0] 8. r[j+1]=r[j]; //记录后移 9. r[j+1]=r[0]; 10. } 11.for(int k=1;k 12. cout< 13. cout<<"\n"; 14.} 1.2 希尔排序 基本思想是:先将整个待排序记录序列分割成若干个子序列,在在序列内分别进行直接插入排序,待整个序列基本有序时,再对全体记录进行一次直接插入排序。 图解: 代码实现: [cpp]view plain copy 1.//希尔排序 2.void ShellSort(int r[], int n) 3.{ 4.int i; 5.int d; 6.int j; 7.for (d=n/2; d>=1; d=d/2) //以增量为d进行直接插入排序 8. { 9.for (i=d+1; i 10. { 11. r[0]=r[i]; //暂存被插入记录 12.for (j=i-d; j>0 && r[0] 13. r[j+d]=r[j]; //记录后移d个位置 14. r[j+d]=r[0]; 15. } 16. } 17.for(i=1;i 18. cout< 19. cout<<"\n"; 20.} 二交换排序 2.1 起泡排序 起泡排序是交换排序中最简单的排序方法,其基本思想是:两两比较相邻记录的关键码,如果反序则交换,直到没有反序的记录为止。 图解: 代码实现: [cpp]view plain copy 1.//起泡排序 2.void BubbleSort(int r[], int n) 3.{ 4.int temp; 5.int exchange; 6.int bound; 7. exchange=n-1; //第一趟起泡排序的范围是r[0]到 r[n-1] 8.while (exchange) //仅当上一趟排序有记录交换才进行本趟 排序 9. { 10. bound=exchange; 11. exchange=0; 12.for (int j=0; j 13.if (r[j]>r[j+1]) 14. { 15. temp=r[j]; 16. r[j]=r[j+1]; 17. r[j+1]=temp; 18. exchange=j; //记录每一次发生记录交换的位置 19. } 20. } 21.for(int i=0;i 22. cout< 23. cout<<"\n"; 24.} 2.2快速排序 基本思想:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。 图解: 代码实现: [cpp]view plain copy 1.//快速排序一次划分 2.int Partition(int r[], int first, int end) 3.{ 4.int i=first; //初始化 5.int j=end; 6.int temp; 7. 8.while (i 9. { 10.while (i 11. j--; //右侧扫描 12.if (i 13. { 14. temp=r[i]; //将较小记录交换到前面 15. r[i]=r[j]; 16. r[j]=temp; 17. i++; 18. } 19.while (i 20. i++; //左侧扫描 21.if (i 22. { 23. temp=r[j]; 24. r[j]=r[i]; 25. r[i]=temp; //将较大记录交换到后面 26. j--; 27. } 28. } 29.return i; //i为轴值记录的最终位置 30.} 31. 32.//快速排序 33.void QuickSort(int r[], int first, int end) 34.{ 35.if (first 36. { //递归结束 37.int pivot=Partition(r, first, end); //一次划分 38. QuickSort(r, first, pivot-1);//递归地对左侧子序列进行快速排序 39. QuickSort(r, pivot+1, end); //递归地对右侧子序列进行快速排序 40. } 41. 42.} 三选择排序