Chinaunix首页 | 论坛 | 博客
  • 博客访问: 49894
  • 博文数量: 27
  • 博客积分: 716
  • 博客等级: 上士
  • 技术积分: 285
  • 用 户 组: 普通用户
  • 注册时间: 2011-08-31 11:12
文章分类

全部博文(27)

文章存档

2012年(8)

2011年(19)

我的朋友

分类: C/C++

2011-10-04 19:11:32

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

  3. #define MAX 5

  4. void mergesort(int *);
  5. void msort(int *, unsigned, unsigned);
  6. void merge(int *, unsigned, unsigned,unsigned);
  7. void showarray(int *);

  8. void main()
  9. {
  10.     int array[MAX] = {5,3,4,2,1};

  11.     showarray(array);
  12.     mergesort(array);
  13.     showarray(array);
  14. }

  15. void mergesort(int *p)
  16. {
  17.     msort(p,0,MAX-1);
  18. }

  19. void msort(int *p, unsigned first, unsigned last)
  20. {
  21.     unsigned mid;
  22.     if(first < last) {
  23.         mid = (first+last) / 2;
  24.         msort(p,first,mid);
  25.         msort(p,mid+1,last);
  26.         merge(p,first,mid,last);
  27.     }
  28. }

  29. void merge(int *p, unsigned first, unsigned mid, unsigned last)
  30. {
  31.     int i,j,k;
  32.     int *q = (int *)malloc((last-first+1) * sizeof(int));
  33.     
  34.     i = first;
  35.     j = mid+1;

  36.     for(k = 0; i <= mid && j <= last; k++) {
  37.         if(p[i] < p[j])    q[k] = p[i++];
  38.         else q[k] = p[j++];
  39.     }

  40.     while(i <= mid) {
  41.         q[k] = p[i++];
  42.         k++;
  43.     }
  44.     while(j <= last) {
  45.         q[k] = p[j++];
  46.         k++;
  47.     }
  48.     for(i = 0, k = first; k <= last; k++) {
  49.         p[k] = q[i];
  50.         i++;
  51.     }
  52.     free(q);
  53. }

  54. void showarray(int *p)
  55. {
  56.     int i;
  57.     for(i = 0; i < MAX; i++) {
  58.         printf("%d ",p[i]);
  59.     }
  60.     printf("\n");
  61. }


复杂度:T(n)=2*T(n/2)+cn    T(n)=cn*lgn+cn
阅读(574) | 评论(0) | 转发(0) |
0

上一篇:全排列--递归

下一篇:insert sort--插入排序

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