- 确定临界点—就是中间元素
- 左右两边各自排序(调用归并函数)
- 具体归并排序(双指针移动)
归并过程
- 把原数组一分为二,两两比较,最小的放入临时数组
- 临时数组元素存回原数组
注意
- 需要辅助空间
- 注意特殊情况
- l 一开始是 0, 具体归并时,把 l 赋值给 i 并且 i不断移动
- i = l 不是1
代码
#include<iostream>
using namespace std;
const int N = 1e6 + 10;
int n;
int q[N];
int temp[N]; //辅助空间
void merge_sort(int q[], int l, int r)
{
if(l >= r) return; //特殊情况
int mid = l + r >> 1;
merge_sort(q, l, mid), merge_sort(q, mid+1, r);
//归并具体过程
int k = 0, i = l, j = mid +1;
while(i <= mid && j <=r)
if(q[i] <= q[j]) temp[ k++ ] = q[i ++ ];
else temp[k ++ ] = q[j ++ ];
while(i <= mid) temp[k ++ ] = q[i ++ ];
while(j <= r) temp[k ++ ] = q[j ++];
// 临时数组元素存回原数组
for(int i = l,j = 0; i <= r; i ++, j ++) q[i] = temp[j];
}
int main()
{
scanf("%d", &n);
for(int i = 0; i < n; i ++) scanf("%d", &q[i]);
merge_sort(q, 0, n-1);
for(int i=0; i<n; i++) printf("%d ", q[i]);
return 0;
}