Chinaunix首页 | 论坛 | 博客
  • 博客访问: 17360
  • 博文数量: 17
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 22
  • 用 户 组: 普通用户
  • 注册时间: 2013-09-01 17:59
个人简介

天下没有笨人,只有不努力的人!

文章分类

全部博文(17)

文章存档

2013年(17)

我的朋友

分类: C/C++

2013-09-01 18:18:04

原文地址:内部排序之---归并排序 作者:遇见0425

【算法思想】
1:分治算法
分治模式在每一层递归上都有三个步骤。
(1)分解:将原问题分解成一系列子问题。
(2)解决:递归的解决各个子问题,若子问题足够小,直接求解。
(3)合并:将自问体结果合并成原文体的解。
2:合并排序
合并排序的三个步骤
(1)分解:将n个元素分成各含有n/2个元素的自序列
(2)解决:用合并排序算法对两个子序列递归排序
(3)合并:合并两个已经排序的子序列得到结果
3:归并排序
基本思想基于合并,将两个或者两个以上有序表合成一个新的有序表。
       假设有初始序列含有n个记录,首先将这n个记录堪称n个有序的子序列,每个自序列的长度为1,然后两两归并,得到[n/2]个长度为2的自序列
       在此基础上,再对长度为2的有序子序列进行两两归并,得到若干个长度为4的有序序列,依次重复。
【过程】
A(19   13)   (5   27  )               (1    26)    (31    16)
B(13    19) (5   27)             (1   26) (16   31)
C(5      13      19     27)            (1   16      26     31)
D(1       5      13       16         19      26      27      31 )
归并排序法的基本操作是将待排序列中相邻的两个有序子序列合并成一个有序序列。 

【算法描述】

点击(此处)折叠或打开

  1. void merge_sort(int *r,int low,int high,int *r2,int len)
  2. {
  3.     int i,j,k;
  4.     int mid=(high+low)/2;
  5.     i=low;
  6.     j=mid+1;
  7.     k=low;
  8.     while(i<=mid&&j<=high)
  9.     {
  10.         if(r[i]<r[j])
  11.         {
  12.             r2[k]=r[i];
  13.             ++i;
  14.         }
  15.         else
  16.         {
  17.             r2[k]=r[j];
  18.             ++j;
  19.         }
  20.         ++k;
  21.     }
  22.     while(i<=mid)
  23.     {
  24.         r2[k]=r[i];
  25.         ++i;
  26.         ++k;
  27.     }
  28.     while(j<=high)
  29.     {
  30.         r2[k]=r[j];
  31.         ++j;
  32.         ++k;
  33.     }
  34. }
  35. void Msort(int r[],int low,int high,int r3[],int len)
  36. {
  37.     int r2[len],mid;
  38.     if(low==high)
  39.         r3[low]=r[low];
  40.     else
  41.     {
  42.         mid=(low+high)/2;
  43.         Msort(r,low,mid,r2,len);
  44.         Msort(r,mid+1,high,r2,len);
  45.         merge_sort(r2,low,high,r3,len);
  46.     }

  47. }
【算法分析】
归并排序中总的时间复杂度是O(nlog2n),空间复杂度为O(n)
【归并列子】

点击(此处)折叠或打开

  1. #include
  2. #include
  3. #include

  4. void merge_sort(int *r,int low,int high,int *r2,int len)
  5. {
  6. int i,j,k;
  7. int mid=(high+low)/2;
  8. i=low;
  9. j=mid+1;
  10. k=low;
  11. while(i<=mid&&j<=high)
  12. {
  13. if(r[i]
  14. {
  15. r2[k]=r[i];
  16. ++i;
  17. }
  18. else
  19. {
  20. r2[k]=r[j];
  21. ++j;
  22. }
  23. ++k;
  24. }
  25. while(i<=mid)
  26. {
  27. r2[k]=r[i];
  28. ++i;
  29. ++k;
  30. }
  31. while(j<=high)
  32. {
  33. r2[k]=r[j];
  34. ++j;
  35. ++k;
  36. }
  37. }
  38. void Msort(int r[],int low,int high,int r3[],int len)
  39. {
  40. int r2[len],mid;
  41. if(low==high)
  42. r3[low]=r[low];
  43. else
  44. {
  45. mid=(low+high)/2;
  46. Msort(r,low,mid,r2,len);
  47. Msort(r,mid+1,high,r2,len);
  48. merge_sort(r2,low,high,r3,len);
  49. }

  50. }
  51. int main()
  52. {
  53. int i;
  54. int r[]={1,4,3,9,7,12,8,5};
  55. int len=8;
  56. int low=0;
  57. int high=len-1;
  58. int r3[len];
  59. Msort(r,low,high,r3,len);
  60. for(i=0;i
  61. printf("%d ",r3[i]);
  62. printf("\n");
  63. }
阅读(197) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~