#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
typedef long long ll;
const int maxn=5e5+5;
int n;
int a[maxn];
int temp[maxn];
int dt[maxn];
ll num=0;
void InsertSort(int a[])
{
int i, j;
for( i=2; i<=n; i++)
{
if(a[i]<a[i-1])
{
a[0]=a[i];
a[i]=a[i-1];
for(j=i-2; a[0]<a[j]; j--) a[j+1]=a[j];
a[j+1]=a[0];
}
}
}
void tempinInsertSort(int a[])
{
for(int i=2; i<=n; i++)
{
a[0]=a[i];
int low=1, high=i-1, mid;
while(low<=high)
{
mid=low+(high-low)/2;
if(a[0]<a[mid]) high=mid-1;
else low=mid+1;
}
for(int j=i-1; j>=high+1; j--) a[j+1]=a[j];
a[high+1]=a[0];
}
}
void MergeSort(int a[],int start, int end)
{
if(start<end)
{
int mid = (start+end)/2 ;
int i=start;
int p = start, q = mid+1;
MergeSort(a, start, mid);
MergeSort(a, mid+1 , end);
while(p<=mid && q<=end)
{
if( a[p]<=a[q])
temp[i++] = a[p++];
else
{
temp[i++] = a[q++];
num+=mid-p+1;
}
}
while(p<=mid) temp[i++]=a[p++];
while(q<=end) temp[i++]=a[q++];
for(int j = start ; j <= end; j++)
a[j] = temp[j];
}
}
void ShellInsert(int a[], int dk)
{
int i, j;
for( i=dk+1; i<=n; i++)
{
if(a[i]<a[i-dk])
{
a[0]=a[i];
for( j=i-dk; j>0 && a[0]<a[j]; j-=dk)
a[j+dk]=a[j];
a[j+dk]=a[0];
}
}
}
void ShellSort(int a[], int dt[], int t)
{
for(int k=0; k<t; k++)
ShellInsert(a, dt[k]);
}
void ShellDt(int n_)
{
int i=0;
int dk=n_/2;
while(dk>=1)
{
dt[i++]=dk;
dk/=2;
}
}
int Partition(int a[], int low, int high)
{
a[0]=a[low];
int pivotkey=a[low];
while(low<high)
{
while(low<high && a[high]>=pivotkey) --high;
a[low]=a[high];
while(low<high && a[low]<=pivotkey) ++low;
a[high]=a[low];
}
a[low]=a[0];
return low;
}
void Qsort(int a[], int low, int high)
{
if(low<high)
{
int pivotkey=Partition(a, low, high);
Qsort(a, low, pivotkey-1);
Qsort(a, pivotkey+1, high);
}
}
void Distribute();
int main()
{
cin>>n;
for(int i=1; i<=n; i++) cin>>a[i];
Qsort(a, 1, n);
for(int i=1; i<=n; i++) cout<<a[i]<<' ';
return 0;
}