#include<iostream>
using namespace std;
const int N=100010;
int q[N],tmp[N];
void mergesort(int q[],int l,int r){
if(l>=r) return;
int mid=(l+r)/2;
mergesort(q,l,mid),mergesort(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++)//原数组下标从L开始是因为每次合并都要进行排序赋值
q[i]=tmp[j];//将合并后的数组赋给原数组
}
int main(){
int n;
cin>>n;
for(int i=0;i<n;i++) cin>>q[i];
mergesort(q,0,n-1);
for(int i=0;i<n;i++) cout<<q[i]<<" ";
return 0;
}