5.归并排序.c 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #define N 7
  4. void merge(int arr[], int low, int mid, int high){
  5. int i, k;
  6. int *tmp = (int *)malloc((high-low+1)*sizeof(int));
  7. //申请空间,使其大小为两个
  8. int left_low = low;
  9. int left_high = mid;
  10. int right_low = mid + 1;
  11. int right_high = high;
  12. for(k=0; left_low<=left_high && right_low<=right_high; k++){ // 比较两个指针所指向的元素
  13. if(arr[left_low]<=arr[right_low]){
  14. tmp[k] = arr[left_low++];
  15. }else{
  16. tmp[k] = arr[right_low++];
  17. }
  18. }
  19. if(left_low <= left_high){ //若第一个序列有剩余,直接复制出来粘到合并序列尾
  20. //memcpy(tmp+k, arr+left_low, (left_high-left_low+l)*sizeof(int));
  21. for(i=left_low;i<=left_high;i++)
  22. tmp[k++] = arr[i];
  23. }
  24. if(right_low <= right_high){
  25. //若第二个序列有剩余,直接复制出来粘到合并序列尾
  26. //memcpy(tmp+k, arr+right_low, (right_high-right_low+1)*sizeof(int));
  27. for(i=right_low; i<=right_high; i++)
  28. tmp[k++] = arr[i];
  29. }
  30. for(i=0; i<high-low+1; i++)
  31. arr[low+i] = tmp[i];
  32. free(tmp);
  33. return;
  34. }
  35. void merge_sort(int arr[], unsigned int first, unsigned int last){
  36. int mid = 0;
  37. if(first<last){
  38. mid = (first+last)/2; /* 注意防止溢出 */
  39. /*mid = first/2 + last/2;*/
  40. //mid = (first & last) + ((first ^ last) >> 1);
  41. merge_sort(arr, first, mid);
  42. merge_sort(arr, mid+1,last);
  43. merge(arr,first,mid,last);
  44. }
  45. return;
  46. }
  47. int main(){
  48. int i;
  49. int a[N]={32,12,56,78,76,45,36};
  50. printf ("排序前 \n");
  51. for(i=0;i<N;i++)
  52. printf("%d\t",a[i]);
  53. merge_sort(a,0,N-1); // 排序
  54. printf ("\n 排序后 \n");
  55. for(i=0;i<N;i++)
  56. printf("%d\t",a[i]); printf("\n");
  57. system("pause");
  58. return 0;
  59. }