// step1 将n个元素分成两个含n/2元素的子序列
// step2 用归并排序将两个子序列递归排序
// step3 合并两个已排好的子序列
#include <iostream>
using namespace std;
const int N=1e6;
int a[N];
void marge_sort(int a[],int l,int r)
{
int b[N];
if(l>=r)return;
int mid=(l+r)/2;
marge_sort(a,l,mid);marge_sort(a,mid+1,r);
int i=l,j=mid+1,k=0;//i从L开始 j从mid+1开始
while(i<=mid && j<=r)//这里有等号
{
if(a[i]>a[j])
b[k++]=a[j++];
else
b[k++]=a[i++];
}
while(i<=mid)
b[k++]=a[i++];
while(j<=r)
b[k++]=a[j++];
for(i=l,j=0;j<k;i++,j++)//这一步最重要 决定了用b数组更新a数组中的位置 b数组也可以是全局变量
a[i]=b[j];
}
int main()
{
int n;
cin>>n;
for(int i=0;i<n;i++)
cin>>a[i];
marge_sort(a,0,n-1);
for(int i=0;i<n;i++)
cout<<a[i]<<" ";
}