二路归并排序
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 }

浙公网安备 33010602011771号