鱼C论坛

 找回密码
 立即注册
查看: 3724|回复: 5

[技术交流] 归并排序

[复制链接]
发表于 2011-7-21 09:42:58 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 冬冬 于 2011-7-23 10:25 编辑
  1. //下面两个函数全都是基于递归的的排序方法,效率都是相当不错的
  2. #include <iostream>
  3. #include <cstdlib>
  4. #include <ctime>
  5. using namespace std;
  6. void MergeSort(int *array ,int first ,int last);//array为要排序的数组,first为要排序的开始位置,last为终止位置
  7. void Merge(int *array,int p,int q,int r);//进行归并的函数
  8. void Print(int *array,int begin,int end);  
  9. void QuickSort(int *array,int fist,int last);  快排函数
  10. int main()
  11. {
  12. int a[10];
  13. int t;
  14. srand(time(NULL));

  15. for (int i=0;i<10;i++)
  16. {
  17.   t=rand()%100;
  18.   a[i]=t;
  19. }
  20. cout<<"排序前——"<<endl;
  21. Print(a,0,9);
  22. // MergeSort(a,0,9);//归并
  23. QuickSort(a,0,9);
  24. cout<<"排序后——"<<endl;
  25. Print(a,0,9);
  26. return 0;
  27. }

  28. void Merge(int *array,int p,int q,int r)
  29. {
  30. int i,k;
  31. int begin1,end1,begin2,end2;
  32. int *temp = (int *)malloc((r-p+1)*sizeof(int));
  33. begin1=p;
  34. end1=q;
  35. begin2=q+1;
  36. end2=r;
  37. k=0;
  38. while((begin1<=end1)&&(begin2<=end2))
  39. {
  40.   if (array[begin1]<array[begin2])
  41.   {
  42.    temp[k]=array[begin1];
  43.    begin1++;
  44.   }
  45.   else
  46.   {
  47.    temp[k]=array[begin2];
  48.    begin2++;
  49.   }
  50.   k++;
  51. }
  52. while (begin1<=end1)
  53. {
  54.   temp[k++]=array[begin1++];
  55. }
  56. while (begin2<=end2)
  57. {
  58.   temp[k++]=array[begin2++];
  59. }
  60. for (i=0;i<=(r-p);i++)
  61. {
  62.   array[p+i]=temp[i];
  63. }
  64. free(temp);

  65. }
  66. void MergeSort(int *array ,int first ,int last)
  67. {
  68. int mid = 0;
  69. if (first <last)
  70. {
  71.   mid = (first+last)/2;
  72.   MergeSort(array,first,mid);
  73.   MergeSort(array,mid+1,last);
  74.   Merge(array,first , mid ,last );
  75. }
  76. }

  77. void Print(int *array,int begin,int end)//begin,end为数组索引位置
  78. {
  79. for (int i=begin;i<=end;i++)
  80. {
  81.   cout<<array[i]<<"  ";
  82. }
  83. cout<<endl;
  84. }
  85. void QuickSort(int *array,int first,int last)
  86. {
  87. int base=array[first];
  88. int x=first,y=last;
  89. if (x>=y)
  90. {
  91.   return;
  92. }
  93. while(x<y)
  94. {
  95.   while(x<y && array[y]>=base)
  96.   y--;
  97.   array[x]=array[y];
  98.   while(x<y && array[x]<=base)
  99.   x++;
  100.   array[y]=array[x];
  101. }

  102. array[y]=base;
  103. QuickSort(array,first,x);
  104. QuickSort(array,x+1,last);
  105. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-7-23 08:39:33 | 显示全部楼层
有点注释,或者能说一下算法的核心思想就好了
一上来就上一段代码
不是那么好理解
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2013-7-1 23:21:14 | 显示全部楼层
看看学习学习
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-7-8 08:32:44 | 显示全部楼层
有二路归并和三路归并一起的那种吗?他们在算法有什么不一样?还有怎么编比较次数和移动次数?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-7-8 13:06:54 | 显示全部楼层
三路归并怎么写啊?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-7-2 11:22:59 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-12 07:29

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表