merge_sort 女爷i 2024-04-18 22:50 84阅读 0赞 归并排序是一种基于归并方法的排序。所谓归并是指将两个或两个以上的有序表合成一个新的有序表,包含所有元素。 利用归并思想进行排序,可这样实现:首先将整个表看成是n个有序子表,每个子表的长度为1。然后两两归并,得到n/2个长度为2的子表。然后再两两归并,得到 n/4个长度为4的有序子表。依此类推,直至得到一个长度为n的有序表为止。 代码如下: **\[cpp\]** [ view plain][view plain] [copy][view plain] [print][view plain] [?][view plain] 1. \#include<iostream> 2. using namespace std; 3. 4. const int MAX=0x7fffffff; 5. 6. void merge(int a\[\],int p,int q,int r) 7. \{ 8. int len1,len2,i,j; 9. 10. len1=q-p+1; 11. len2=r-q; 12. 13. int \*p1=new int\[len1+1\]; 14. int \*p2=new int\[len2+1\]; 15. 16. for(i=0;i<len1;i++) 17. p1\[i\]=a\[p+i\]; 18. for(j=0;j<len2;j++) 19. p2\[j\]=a\[q+j+1\]; 20. 21. p1\[len1\]=MAX; //哨兵,假设输入的数都是小于MAX的 22. p2\[len2\]=MAX; 23. 24. i=j=0; 25. for(int k=p;k<=r;k++) //合并 26. \{ 27. if(p1\[i\]<=p2\[j\]) 28. a\[k\]=p1\[i++\]; 29. else 30. a\[k\]=p2\[j++\]; 31. \} 32. 33. delete \[\] p1; 34. delete \[\] p2; 35. \} 36. 37. void merge\_sort(int a\[\],int p,int r) //递归算法 38. \{ 39. int q; 40. 41. if(p<r) 42. \{ 43. q=(p+r)/2; //划分 44. 45. merge\_sort(a,p,q); 46. merge\_sort(a,q+1,r); 47. 48. merge(a,p,q,r); //合并两子序列 49. \} 50. \} 51. 52. int main() 53. \{ 54. int i,n,a\[100\]; 55. 56. while(cin>>n,n) 57. \{ 58. for(i=0;i<n;i++) 59. cin>>a\[i\]; 60. 61. merge\_sort(a,0,n-1); //传递数组下标 62. 63. for(i=0;i<n;i++) 64. cout<<a\[i\]<<" "; 65. cout<<endl<<endl; 66. \} 67. 68. return 0; 69. \} #include<iostream> using namespace std; const int MAX=0x7fffffff; void merge(int a[],int p,int q,int r) { int len1,len2,i,j; len1=q-p+1; len2=r-q; int *p1=new int[len1+1]; int *p2=new int[len2+1]; for(i=0;i<len1;i++) p1[i]=a[p+i]; for(j=0;j<len2;j++) p2[j]=a[q+j+1]; p1[len1]=MAX; //哨兵,假设输入的数都是小于MAX的 p2[len2]=MAX; i=j=0; for(int k=p;k<=r;k++) //合并 { if(p1[i]<=p2[j]) a[k]=p1[i++]; else a[k]=p2[j++]; } delete [] p1; delete [] p2; } void merge_sort(int a[],int p,int r) //递归算法 { int q; if(p<r) { q=(p+r)/2; //划分 merge_sort(a,p,q); merge_sort(a,q+1,r); merge(a,p,q,r); //合并两子序列 } } int main() { int i,n,a[100]; while(cin>>n,n) { for(i=0;i<n;i++) cin>>a[i]; merge_sort(a,0,n-1); //传递数组下标 for(i=0;i<n;i++) cout<<a[i]<<" "; cout<<endl<<endl; } return 0; } 还有一种不需要设置哨兵的merge()代码,如下: **\[cpp\]** [ view plain][view plain] [copy][view plain] [print][view plain] [?][view plain] 1. void merge(int a\[\],int p,int q,int r) 2. \{ 3. int len1,len2,i,j,k;; 4. 5. len1=q-p+1; 6. len2=r-q; 7. 8. int \*p1=new int\[len1\]; 9. int \*p2=new int\[len2\]; 10. 11. for(i=0;i<len1;i++) 12. p1\[i\]=a\[p+i\]; 13. for(j=0;j<len2;j++) 14. p2\[j\]=a\[q+j+1\]; 15. 16. i=j=0; 17. k=p; 18. while(i<len1 && j<len2) 19. \{ 20. if(p1\[i\]<=p2\[j\]) 21. a\[k++\]=p1\[i++\]; 22. else 23. a\[k++\]=p2\[j++\]; 24. \} 25. 26. /\*两个while,最多只能执行一个\*/ 27. while(i<len1) 28. a\[k++\]=p1\[i++\]; 29. while(j<len2) 30. a\[k++\]=p2\[j++\]; 31. \} void merge(int a[],int p,int q,int r) { int len1,len2,i,j,k;; len1=q-p+1; len2=r-q; int *p1=new int[len1]; int *p2=new int[len2]; for(i=0;i<len1;i++) p1[i]=a[p+i]; for(j=0;j<len2;j++) p2[j]=a[q+j+1]; i=j=0; k=p; while(i<len1 && j<len2) { if(p1[i]<=p2[j]) a[k++]=p1[i++]; else a[k++]=p2[j++]; } /*两个while,最多只能执行一个*/ while(i<len1) a[k++]=p1[i++]; while(j<len2) a[k++]=p2[j++]; } Attention: ①归并排序不是就地排序,需要与原数组等量的存储空间。空间复杂度较高。 ②归并排序的时间复杂度为O(nlog2n)。 [view plain]: http://blog.csdn.net/lulipeng_cpp/article/details/7459840#
相关 归并排序(MergeSort)(防止标题重复) 归并排序(MergeSort) 1 归并排序原理 分解成最小的记录块(长度为0或1),必须要排序,就是有序块 然后再归并 2 归并排序算法的实现 // 我会带着你远行/ 2022年12月27日 07:58/ 0 赞/ 161 阅读
相关 作业4-8-15:MapReduce编程—Merge和MergeSort 请编写2个MapReduce程序,分别实现功能: (1)合并HDFS文档并去掉重复的记录 (2)对HDFS文档中的数字进行排序,并输出序号和排序结果 请提交程序代码截 妖狐艹你老母/ 2022年11月17日 05:08/ 0 赞/ 119 阅读
相关 【模板】快速排序 与 归并排序——Template,QuickSort&MergeSort 快速排序 include<iostream> using namespace std; int n,a[1000001]; void qsor 秒速五厘米/ 2022年11月12日 02:51/ 0 赞/ 247 阅读
相关 JavaScript实现MergeSort归并排序算法(附完整源码) JavaScript实现MergeSort归并排序算法(附完整源码) Comparator.js完整源代码 Sort.js完整源代码 MergeSort 桃扇骨/ 2022年09月07日 09:55/ 0 赞/ 220 阅读
相关 MergeSort 从上往下的归并排序:它与"从下往上"在排序上是反方向的。它基本包括3步: ① 分解 -- 将当前区间一分为二,即求分裂点 mid = (low + high)/2; 向右看齐/ 2022年06月02日 04:18/ 0 赞/ 110 阅读
还没有评论,来说两句吧...