归并排序
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 1000010;
int a[N];
int b[N];
void copy(int * a, int * b, int lp, int rp)
{
for(int i = lp; i <= rp; i ++) a[i] = b[i];
}
void merge(int l, int r)
{
if(l >= r) return ;
int mid = (l + r) >> 1;
merge(l, mid);
merge(mid + 1, r);
int i = l;
int j = mid + 1;
int tot = l;
while(i <= mid && j <= r)
{
if(a[i] < a[j])
{
b[tot ++] = a[i ++];
}
else
{
b[tot ++] = a[j ++];
}
}
while(i <= mid)
{
b[tot ++] = a[i ++];
}
while(j <= r)
{
b[tot ++] = a[j ++];
}
copy(a, b, l, r);
}
int main()
{
int n;
cin >> n;
for (int i = 1; i <= n; i ++ )
{
scanf("%d", &a[i]);
}
merge(1, n);
for (int i = 1; i <= n; i ++ )
{
printf("%d ", a[i]);
}
puts("");
return 0;
}