Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2112795
  • 博文数量: 438
  • 博客积分: 3871
  • 博客等级: 中校
  • 技术积分: 6075
  • 用 户 组: 普通用户
  • 注册时间: 2011-09-10 00:11
个人简介

邮箱: wangcong02345@163.com

文章分类

全部博文(438)

文章存档

2017年(15)

2016年(119)

2015年(91)

2014年(62)

2013年(56)

2012年(79)

2011年(16)

分类: LINUX

2016-08-08 16:14:36

1. 归并排序

1.2 代码
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #define dbmsg(fmt, args ...) printf("%s:%s[%d]: "fmt"\n", __FILE__,__FUNCTION__, __LINE__,##args)
  4. #define SWAP(x,y) (x=(x)+(y),y=(x)-(y),x=(x)-(y))
  5. int dump_array(int* arr, int len)
  6. {
  7.     int i;
  8.     for(i=0; i<len; i++)
  9.     {
  10.         printf("%d ", arr[i]);
  11.     }
  12.     printf("\n");
  13.     return 0;
  14. }
  15. void merge(int* arr, int* temp, int first, int mid, int last)
  16. {
  17.     int i=first, j=mid+1;
  18.     int m=mid, n = last;
  19.     int k=0;
  20.     printf("first=%d=%d,mid=%d=%d,last=%d=%d\n", first, arr[first], mid, arr[mid], last, arr[last]);
  21.     while( (i<=m) && (j<=n) )
  22.     {
  23.         if (arr[i] <= arr[j])
  24.             temp[k++] = arr[i++];
  25.         else
  26.             temp[k++] = arr[j++];
  27.     }
  28.     printf("in mid dump\n");
  29.        dump_array(temp, k);
  30.     while(i<=m)
  31.         temp[k++] = arr[i++];
  32.       
  33.     while(j<=n)
  34.         temp[k++] = arr[j++];
  35.       
  36.     printf("in last dump\n");
  37.        dump_array(temp, k);
  38.     for(i=0; i<k; i++)
  39.         arr[first + i] = temp[i];
  40. }
  41. void msort(int* arr, int* temp, int first, int last)
  42. {
  43.     if (first<last)
  44.     {
  45.         int mid = (first + last)/2;
  46.         msort(arr, temp, first, mid); //left
  47.         msort(arr, temp, mid + 1, last); //right
  48.         merge(arr, temp, first, mid, last); //merge left right
  49.     }
  50. }
  51.   
  52. int merge_sort(int* arr, int len)
  53. {
  54.     int *temp = (int*) malloc(sizeof(int)*len);
  55.     if (temp == NULL)
  56.         return -1;
  57.     msort(arr, temp, 0, len-1);
  58.     free(temp);
  59.     return 0;
  60. }

  61. int main ( int argc, char *argv[] )
  62. {
  63.     //int arr[] = {49, 38, 65, 97, 76, 13, 27, 49};
  64.     int arr[] = {49, 38, 65, 97, 76, 13, 27, 49, 55, 4};
  65.     //int arr[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
  66.     int len = sizeof(arr)/sizeof(int);
  67.     dbmsg("array len=%d", len);
  68.     dump_array(arr, len);
  69.     merge_sort(arr, len);
  70.     printf("after HeapSort\n");
  71.     dump_array(arr, len);
  72.     return EXIT_SUCCESS;
  73. }

1.3 运行结果
  1. merge.c:main[68]: array len=10
  2. 49 38 65 97 76 13 27 49 55 4
  3. first=0=49,mid=0=49,last=1=38
  4. in mid dump
  5. 38
  6. in last dump
  7. 38 49
  8. first=0=38,mid=1=49,last=2=65
  9. in mid dump
  10. 38 49
  11. in last dump
  12. 38 49 65
  13. first=3=97,mid=3=97,last=4=76
  14. in mid dump
  15. 76
  16. in last dump
  17. 76 97
  18. first=0=38,mid=2=65,last=4=97
  19. in mid dump
  20. 38 49 65
  21. in last dump
  22. 38 49 65 76 97
  23. first=5=13,mid=5=13,last=6=27
  24. in mid dump
  25. 13
  26. in last dump
  27. 13 27
  28. first=5=13,mid=6=27,last=7=49
  29. in mid dump
  30. 13 27
  31. in last dump
  32. 13 27 49
  33. first=8=55,mid=8=55,last=9=4
  34. in mid dump
  35. 4
  36. in last dump
  37. 4 55
  38. first=5=13,mid=7=49,last=9=55
  39. in mid dump
  40. 4 13 27 49
  41. in last dump
  42. 4 13 27 49 55
  43. first=0=38,mid=4=97,last=9=55
  44. in mid dump
  45. 4 13 27 38 49 49 55
  46. in last dump
  47. 4 13 27 38 49 49 55 65 76 97
  48. after merge sort
  49. 4 13 27 38 49 49 55 65 76 97
1.4 分析
49 38 65 97 76 13 27 49 55 4  第一趟(49)(38)    (97)(76)     (13)(27)    (55)(4)       

49 38 65 97 76 13 27 49 55 4  第二趟 (49,38)(65)           (13,27)(49) 

49 38 65 97 76 13 27 49 55 4  第三趟(49,38,65)(97,76)         (13,27,49)(55,4)   

49 38 65 97 76 13 27 49 55 4  第四趟(49,38,65,97,76) (13,27,49,55,4) 

4 13 27 38 49 49 55 65 76 97   完成后就是结果了


阅读(878) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~