Chinaunix首页 | 论坛 | 博客
  • 博客访问: 119906
  • 博文数量: 32
  • 博客积分: 506
  • 博客等级: 下士
  • 技术积分: 257
  • 用 户 组: 普通用户
  • 注册时间: 2012-07-11 11:06
文章分类

全部博文(32)

文章存档

2012年(32)

分类: C/C++

2012-10-18 10:40:16

    归并排序,它采取分而治之(Divide-and-Conquer)的策略,时间复杂度是Θ(nlgn)。归并排序的步骤如下:
1. Divide: 把长度为n的输入序列分成两个长度为n/2的子序列。
2. Conquer: 对这两个子序列分别采用归并排序。
3. Combine: 将两个排序好的子序列合并成一个最终的排序序列。
在描述归并排序的步骤时又调用了归并排序本身,可见这是一个递归的过程。

点击(此处)折叠或打开

  1. #include
  2. #define LEN 8
  3. int a[LEN] = { 5, 2, 4, 7, 1, 3, 2, 6 };
  4. void merge(int start, int mid, int end)
  5. {
  6.     int n1 = mid - start 1;
  7.     int n2 = end - mid;
  8.     int left[n1], right[n2];
  9.     int i, j, k;
  10.    
  11.     for (i = 0; i < n1; i++) /* left holds a[start..mid] */
  12.     left[i] = a[start+i];
  13.     for (j = 0; j < n2; j++) /* right holds a[mid 1..end] */
  14.     right[j] = a[mid+1+j];
  15.    
  16.     i = j = 0;
  17.     k = start;
  18.     while (i < n1 && j < n2)
  19.         if (left[i] < right[j])
  20.             a[k++] = left[i++];
  21.         else
  22.             a[k++] = right[j++];
  23.     while (i < n1) /* left[] is not exhausted */
  24.         a[k++] = left[i++];
  25.     while (j < n2) /* right[] is not exhausted */
  26.         a[k++] = right[j++];
  27. }
  28. void sort(int start, int end)
  29. {
  30.     int mid;
  31.    
  32.     if (start < end)
  33.     {
  34.         mid = (start+end) / 2;
  35.         printf("sort (%d-%d, %d-%d) %d %d %d %d %d %d %d %d\n", start, mid, mid+1,
  36.                 end, a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7]);
  37.         sort(start, mid);
  38.         sort(mid+1, end);
  39.         merge(start, mid, end);
  40.         printf("merge (%d-%d, %d-%d) to %d %d %d %d %d %d %d %d\n", start, mid,
  41.                mid+1, end, a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7]);
  42.     }
  43. }
  44. int main(void)
  45. {
  46.     sort(0, LEN-1);
  47.     return 0;
  48. }
执行结果:

sort (0-3, 4-7) 5 2 4 7 1 3 2 6

sort (0-1, 2-3) 5 2 4 7 1 3 2 6

sort (0-0, 1-1) 5 2 4 7 1 3 2 6

merge (0-0, 1-1) to 2 5 4 7 1 3 2 6

sort (2-2, 3-3) 2 5 4 7 1 3 2 6

merge (2-2, 3-3) to 2 5 4 7 1 3 2 6

merge 0-1, 2-3) to 2 4 5 7 1 3 2 6

sort (4-5, 6-7) 2 4 5 7 1 3 2 6

sort (4-4, 5-5) 2 4 5 7 1 3 2 6

merge (4-4, 5-5) to 2 4 5 7 1 3 2 6

sort (6-6, 7-7) 2 4 5 7 1 3 2 6

merge (6-6, 7-7) to 2 4 5 7 1 3 2 6

merge (4-5, 6-7) to 2 4 5 7 1 2 3 6

merge (0-3, 4-7) to 1 2 2 3 4 5 6 7


 


阅读(2100) | 评论(0) | 转发(1) |
0

上一篇:插入排算法示例

下一篇:快速排序算法

给主人留下些什么吧!~~