算法---7.归并排序

来源:互联网 发布:king of the hill知乎 编辑:程序博客网 时间:2024/05/17 06:38
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. in last dump
  36. 4 55 
  37. first=5=13,mid=7=49,last=9=55
  38. in mid dump
  39. 4 13 27 49 
  40. in last dump
  41. 4 13 27 49 55 
  42. first=0=38,mid=4=97,last=9=55
  43. in mid dump
  44. 4 13 27 38 49 49 55 
  45. in last dump
  46. 4 13 27 38 49 49 55 65 76 97 
  47. after merge sort
  48. 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   完成后就是结果了
0 0
原创粉丝点击