Chinaunix首页 | 论坛 | 博客
  • 博客访问: 88157
  • 博文数量: 60
  • 博客积分: 4002
  • 博客等级: 中校
  • 技术积分: 645
  • 用 户 组: 普通用户
  • 注册时间: 2010-03-17 18:11
文章分类

全部博文(60)

文章存档

2011年(60)

我的朋友

分类: LINUX

2011-01-02 13:37:40

    归并排序:
    设归并排序的当前区间是R[low..high],分治法的三个步骤是:
①分解:将当前区间一分为二,即求分裂点
                

②求解:递归地对两个子区间R[low..mid]和R[mid+1..high]进行归并排序;
③组合:将已排序的两个子区间R[low..mid]和R[mid+1..high]归并为一个有序的区间R[low..high]。
  递归的终结条件:子区间长度为1(一个记录自然有序)。

  1. #include <stdio.h>
  2. #include <limits.h>

  3. void merge(int *a, int start, int mid, int end);
  4. void mergeSort(int *a, int start, int end);

  5. int
  6. main(int argc, char **argv)
  7. {
  8.     int a[] = {2, 3, 4, 9, 8, 6, 0, 4, 1, 5, 7};
  9.     int num;
  10.     
  11.     num = sizeof(a) / sizeof(int);

  12.     printf("num = %d.\n", num);

  13.     int i;
  14.     
  15.     printf("Before merge sort:\n");
  16.     for(i = 0; i < num; i++) {
  17.         printf("%d,", a[i]);
  18.     }
  19.     printf("\n");

  20.     mergeSort(a, 0, num-1);

  21.     printf("After merge sort:\n");
  22.     for(i = 0; i < num; i++) {
  23.         printf("%d,", a[i]);
  24.     }
  25.     printf("\n");

  26.     return 0;
  27. }

  28. void merge(int *a, int start, int mid, int end)
  29. {
  30.     int n1, n2;

  31.     n1 = mid - start + 1;
  32.     n2 = end - mid;

  33.     int L[n1 + 1], R[n2 + 1];

  34.     int i, j;
  35.     
  36.     for(i = 0; i < n1; i++) {
  37.         L[i] = *(a+start+i);
  38.     }

  39.     for(j = 0; j < n2; j++) {
  40.         R[j] = *(a+mid+j+1);
  41.     }

  42.     L[i] = INT_MAX;
  43.     R[j] = INT_MAX;

  44.     i = j = 0;

  45.     int t;
  46.     for(t = start; t <= end; t++) {
  47.         if(L[i] <= R[j]) {
  48.             *(a+t) = L[i];
  49.             i++;
  50.         } else {
  51.             *(a+t) = R[j];
  52.             j++;
  53.         }
  54.     }
  55. }


  56. void mergeSort(int *a, int start, int end)
  57. {
  58.     int mid;
  59.     if(start < end) {
  60.         mid = (start + end) / 2;
  61.         mergeSort(a, start, mid);    
  62.         mergeSort(a, mid+1, end);
  63.         merge(a, start, mid, end);
  64.     }
  65. }
注:平均时间复杂度为:O(nlgn), 稳定。

阅读(606) | 评论(0) | 转发(0) |
0

上一篇:插入排序

下一篇:冒泡排序

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