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 }