二路归并排序

1.时间复杂度:O(nlog2n)

2.空间复杂度:O(n)

3.实现:

 1 void MergeSort(int* a, int n) {
 2     int* b = (int*)calloc(n + 1, sizeof(int));//创建a的备份b
 3     MSort(a, b, 1, n);
 4     free(b);
 5 }
 6 
 7 void MSort(int* a, int* b, int low, int high) {
 8     int mid;
 9     if (low < high){
10         mid = (low + high) / 2;
11         MSort(a, b, low, mid);//分别对左右半部分进行递归归并
12         MSort(a, b, mid + 1, high);
13         Merge(a, b, low, mid, high);//进行归并
14     }
15 }
16 
17 void Merge(int* a, int* b, int low, int mid, int high) {
18     int i, j;
19     for (i = low; i <= high; i++) {//a的备份b
20         b[i] = a[i];
21     }
22     for (i = low, j = mid + 1; low <= mid && j <= high; i++) {//将b中记录由小到大地录入a中
23         a[i] = b[low] < b[j] ? b[low++] : b[j++];
24     }
25     while (low <= mid) {//将剩余的b[low..mid]复制到a
26         a[i++] = b[low++];
27     }
28     while (j <= high) {//将剩余的b[mid+1..high]复制到a
29         a[i++] = b[j++];
30     }
31 }

4.源代码

 1 //在 Microsoft Visual Studio Community 2022 环境测试通过
 2 #define _CRT_SECURE_NO_WARNINGS
 3 #include <stdio.h>
 4 #include <stdlib.h>
 5 
 6 void Merge(int* a, int* b, int low, int mid, int high) {
 7     int i, j;
 8     for (i = low; i <= high; i++) {//a的备份b
 9         b[i] = a[i];
10     }
11     for (i = low, j = mid + 1; low <= mid && j <= high; i++) {//将b中记录由小到大地录入a中
12         a[i] = b[low] < b[j] ? b[low++] : b[j++];
13     }
14     while (low <= mid) {//将剩余的b[low..mid]复制到a
15         a[i++] = b[low++];
16     }
17     while (j <= high) {//将剩余的b[mid+1..high]复制到a
18         a[i++] = b[j++];
19     }
20 }
21 
22 void MSort(int* a, int* b, int low, int high) {
23     int mid;
24     if (low < high){
25         mid = (low + high) / 2;
26         MSort(a, b, low, mid);//分别对左右半部分进行递归归并
27         MSort(a, b, mid + 1, high);
28         Merge(a, b, low, mid, high);//进行归并
29     }
30 }
31 
32 void MergeSort(int* a, int n) {
33     int* b = (int*)calloc(n + 1, sizeof(int));//创建a的备份b
34     MSort(a, b, 1, n);
35     free(b);
36 }
37 
38 int main(void) {
39     int i, a[11] = { 0, 5, 9, 0, 6, 4, 7, 3, 2, 8, 1 };
40     MergeSort(a, 10);
41     for (i = 1; i < 11; i++) {
42         printf("%d ", a[i]);
43     }
44     return 0;
45 }
源代码

 

posted @ 2022-02-12 03:29  吕辉  阅读(81)  评论(0)    收藏  举报