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
| #include <stdio.h> #include <stdlib.h> #include <assert.h> #include <string.h>
void _Merge(int *a, int begin1, int end1, int begin2, int end2, int *tmp) { int index = begin1; int i = begin1, j = begin2; while (i <= end1&&j <= end2){ if (a[i]<=a[j]) tmp[index++] = a[i++]; else tmp[index++] = a[j++]; } while (i <= end1) tmp[index++] = a[i++]; while (j <= end2) tmp[index++] = a[j++]; memcpy(a + begin1, tmp + begin1, sizeof(int)*(end2 - begin1 + 1)); }
void MergeSort(int *a, int left, int right, int *tmp) { if (left >= right) return; assert(a); int mid = left + ((right - left) >> 1); MergeSort(a, left, mid, tmp); MergeSort(a, mid + 1, right, tmp); _Merge(a, left, mid, mid + 1, right, tmp); }
void PrintArray(int *a, int len) { assert(a); for (int i = 0; i < len; i++) printf("%d ", a[i]); printf("\n"); } int main() { int a[] = { 10, 6, 7, 1, 3, 9, 4, 2 }; int *tmp = (int *)malloc(sizeof(int)*(sizeof(a) / sizeof(int))); memset(tmp, -1, sizeof(a) / sizeof(int)); MergeSort(a, 0, sizeof(a) / sizeof(int)-1, tmp); PrintArray(a, sizeof(a) / sizeof(int)); system("pause"); return 0; }
|