题目:给出 n 个无序的整数,试把它们从小到大排序。
![](https://i-blog.csdnimg.cn/blog_migrate/03d2e23c09b2b23cd4b81ef5d6718644.png)
图解:
![](https://i-blog.csdnimg.cn/blog_migrate/4693e1194d01b47a87ac8736ced35811.jpeg)
代码如下:
#include<bits/stdc++.h>
using namespace std;
#define MAX_SIZE 50000
int myData[MAX_SIZE + 10];
int n;
//打印
void traverse(int* myData, int lo, int hi) {
for (int i = lo; i < hi; i++) {
printf("%d ", myData[i]);
}
printf("\n");
}
//合并
void my_merge(int* myData, int lo, int mid, int hi) {
int* B = (int*)malloc((mid - lo) * sizeof(int));//分配空间给辅助数组B存放左半区[lo,mid)
int* C = (int*)malloc((hi - mid) * sizeof(int));//分配空间给辅助数组C存放右半区[mid,hi)
for (int i = lo; i < mid; i++) {//将左半区[lo,mid)的元素存放辅助数组B
B[i - lo] = myData[i];
}
for (int i = mid; i < hi; i++) {//将右半区[mid,hi)的元素存放辅助数组C
C[i - mid] = myData[i];
}
//比较左右半区第一个元素大小,谁小就放谁进原数组(覆盖原数组下标从0开始)
int i = 0, j = 0, k = lo;
while (i < mid - lo && j < hi - mid) {//左右半区均有元素
if (B[i] <= C[j]) {
myData[k++] = B[i++];
} else {
myData[k++] = C[j++];
}
}
while (i < mid - lo) {//左半区有元素,右半区无元素
myData[k++] = B[i++];
}
while (j < hi - mid) {//右半区有元素,左 半区无元素
myData[k++] = C[j++];
}
free(B);
free(C);
}
//二路归并排序
void mergeSort(int* myData, int lo, int hi) {
//划分
if (hi - lo < 2) return;//递归出口,该区间只有一个元素或者没有元素,已经有序,不需要再继续分治
int mid = (lo + hi) >> 1;//找中间数
mergeSort(myData, lo, mid);//划分左半区
mergeSort(myData, mid, hi);//划分右半区
//归并
my_merge(myData, lo, mid, hi);
//打印
traverse(myData, lo, hi);
}
//主函数
int main() {
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%d", &myData[i]);
}
mergeSort(myData, 0, n);
return 0;
}
写代码容易出错的地方
(1)将左右半区存进辅助数组B,C