#include<stdio.h>
#include<queue>
#include<iostream>
using namespace std;
#include<algorithm>
typedef long long ll;
#define maxn 1000001
/*思想是不断的将数组二分,然后在分到两边只剩一个元素的时候,对两个元素进行合并
,完成两个元素的合并排序,小处不断合并排序,大处不断合并排序有序
递归从最少的元素开始排序合并*/
void Merge(int a[], int s, int mid, int e, int tmp[])
{///合并排序
int pb=0;
int p1=s,p2=mid+1;
while(p1<=mid && p2<=e)
{
if(a[p1]<a[p2])
tmp[pb++] = a[p1++];
else
tmp[pb++] = a[p2++];
}
while(p1<=mid)
tmp[pb++] =a[p1++];
while(p2<=e)
tmp[pb++] = a[p2++];
for(int i=0; i<e-s+1;i++)
a[s+i] = tmp[i];
}
void Merge_sort(int a[], int s, int e, int tmp[])
{
if(s<e)
{
int mid = s+(e-s)/2;
Merge_sort(a, s, mid, tmp);
Merge_sort(a, mid+1, e, tmp);
Merge(a,s, mid, e, tmp);
}
}
int main()
{
ios::sync_with_stdio(false);
int a[maxn];
int tmp[maxn], n;
cin>>n;
for(int i=0; i<n;i++)
cin>>a[i];
Merge_sort(a,0, n-1,tmp);
for(int i=0;i<n;i++)
{
if(i!=n-1)
cout<<a[i]<<" ";
else
cout<<a[i]<<endl;
}
//system("pause");
}