1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96
| #include <stdio.h> #include <stdlib.h>
void merge(int arr[], int left, int mid, int right) { int len1=mid-left+1; int len2=right-mid;
int *leftarr=(int*)malloc(len1*sizeof(int)); int *rightarr=(int*)malloc(len2*sizeof(int)); if (leftarr==NULL||rightarr==NULL) { printf("内存分配失败!\n"); return; } for (int i = 0; i < len1; i++) { leftarr[i]=arr[left+i]; } for (int j = 0; j < len2; j++) { rightarr[j]=arr[mid+j+1]; }
int i=0,j=0,k=left; while (i<len1&&j<len2) { if (leftarr[i]<=rightarr[j]) { arr[k++]=leftarr[i++]; } else{ arr[k++]=rightarr[j++]; } } while (i<len1) { arr[k++]=leftarr[i++]; } while (j<len2) { arr[k++]=rightarr[j++]; } free(leftarr); free(rightarr); return; }
void mergeSort(int arr[], int left, int right){ if (left>=right) { return; }
int mid=left+(right-left)/2; mergeSort(arr,left,mid); mergeSort(arr,mid+1,right);
merge(arr,left,mid,right); }
void printArray(int arr[], int n) { for (int i = 0; i < n; i++) { printf("%d ", arr[i]); } printf("\n"); }
int main() { int arr[] = {12, 11, 13, 5, 6, 7}; int n = sizeof(arr) / sizeof(arr[0]);
printf("原始数组:"); printArray(arr, n);
mergeSort(arr, 0, n - 1);
printf("排序后数组(升序):"); printArray(arr, n);
return 0; }
|