归并排序
1 #include <stdio.h> 2 #include <stdlib.h> 3 4 int *temp; // 暂存数组 5 // 归并 6 void merge(int sz[], int m, int n, int p) 7 { 8 int i = m, j = n + 1, k = m; 9 while (i <= n && j <= p) 10 { 11 if (temp[i] > temp[j]) 12 sz[k++] = temp[j++]; 13 else 14 sz[k++] = temp[i++]; 15 } 16 while (i <= n) 17 sz[k++] = temp[i++]; 18 while (j <= p) 19 sz[k++] = temp[j++]; 20 // 将排序后的元素,全部都整合回数组temp中。 21 for (i = m; i <= p; i++) 22 temp[i] = sz[i]; 23 } 24 25 void merge_sort(int sz[], int start, int end) 26 { 27 if (start < end) 28 { 29 int mid = (start + end) >> 1; 30 merge_sort(sz, start, mid); // 递归排序a[start...mid] 31 merge_sort(sz, mid + 1, end); // 递归排序a[mid+1...end] 32 merge(sz, start, mid, end); // 调用merge将start-mid,mid+1-end归并 33 } 34 } 35 36 int main() 37 { 38 // 初始数组 39 int a[] = {-10, 5, 100, 78, 9, 30, -101}; 40 // 暂存数组 41 temp = (int *)malloc(sizeof(a)); 42 for (int i = 0; i <= 6; i++) // 将暂存数组复制为初始数组 43 temp[i] = a[i]; 44 merge_sort(a, 0, 6); // 排序 45 for (int i = 0; i < 7; i++) // 输出结果 46 printf("%d%c", a[i], i == 6 ? '\n' : ' '); 47 return 0; 48 }