归并排序

 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 }

 

posted @ 2019-04-25 08:30  sqdtss  阅读(127)  评论(0)    收藏  举报