算法思想:
#include<bits/stdc++.h>
using namespace std;
const int N = 1000010;
int a[N],tmp[N]; //tmp数组用来存放归并整合的数组
void merge_sort(int q[],int l,int r){
if(l >= r){
return;
}
int mid = l + r >> 1; //mid为数组二分位置上的点
merge_sort(q,l,mid);merge_sort(q,mid+1,r); //递归
int k = 0,i = l,j = mid +1; //i为前半个数组的指针,从头开始遍历前半个数组,j同理
while(i <= mid && j <= r){
if(q[i] <= q[j]){
tmp[k ++ ] = q[i ++ ]; //tmp数组存放较小值,较小的数组指针后移
}
else{
tmp[k ++ ] = q[j ++ ];
}
}
while(i <= mid){ //当前后中一个数组遍历完时,把没遍历完的数组接到tmp数组后
tmp[k ++ ] = q[i ++ ];
}
while(j <= r){
tmp[k ++ ] = q[j ++ ];
}
for(i = l,j = 0;i <= r;i ++ ,j ++){ //把tmp数组赋值给原数组q
q[i] = tmp[j];
}
}
int main()
{
int n;
cin >> n;
for(int i = 0;i < n;i ++ ){
scanf("%d",&a[i]);
}
merge_sort(a,0,n-1);
for(int i = 0;i < n;i ++){
printf("%d ",a[i]);
}
return 0;
}