分治策略
#include<iostream>
#include<cstdio>
using namespace std;
const int N = 100010;
int n;
int q[N],tmp[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; //k计数 i左半边起点 j右半边起点
while(i<=mid && j<=r) {
if(q[i]<=q[j])
tmp[k++]=q[i++];
else
tmp[k++]=q[j++];
}
//左半边或者右半边没有循环完
while(i<=mid) {
tmp[k++]=q[i++];
}
while(j<=r) {
tmp[k++]=q[j++];
}
//复制
for(i=l,j=0;i<=r;i++,j++)
q[i]=tmp[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;
}