#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>
using namespace std;
//堆排序 O(ologn)
void down(vector<int> &h,int size,int u)
{
int t=u;
while(2*u <= size && h[u*2] > h[t]) t=u*2;
while(2*u+1 <= size && h[u*2+1] > h[t]) t=u*2+1;
if(t!=u)
{
swap(h[t],h[u]);
down(h, size, t);
}
}
void up(vector<int> &h,int u)
{
while(u / 2 && h[u / 2] < h[u]){
swap(h[u / 2],h[u]);
u /= 2;
}
}
void insert(vector<int> &h,int size,int x)
{
h[++size] = x;
up(h,x);
}
void remove_top(vector<int> &h,int size)
{
h[1] = h[size];
size --;
down(h, size, 1);
}
void heapsort(vector<int> &h,int n)
{
int size=n;
for(int i=1;i<=n;i++) up(h,i);
for(int i=1;i<=n;i++)
{
swap(h[1],h[size]);
size--;
down(h,size,1);
}
}
void countsort(vector<int> &a,int n)
{
vector<int> v(101,0);
for(int i=1;i<=n;i++) v[a[i]]++;
for(int i=1,k=1;i<=100;i++)
{
while(v[i])
{
a[k++]=i;
v[i]--;
}
}
cout << endl;
}
//获取个位,百位 ....
int get(int x,int n)
{
while(n--) x/=10;
return x%=10;
}
void radixsort(vector<int> &a,int n)
{
vector<vector<int>> v(10);
//表示数据的位数
for(int i=0;i<4;i++)
{
//循环10个数
for(int j=0;j<10;j++) v[j].clear();
//把数据按位数放入二维数组中
for(int j=1;j<=n;j++)
{
v[get(a[j],i)].push_back(a[j]);
}
//遍历
for(int j=0,k=1;j<10;j++)
{
for(int x:v[j])
a[k++] = x;
}
}
}
int main()
{
int n;
vector<int> a;
cin>>n;
a.resize(n+1);
for(int i=1;i<=n;i++) cin >> a[i];
heapsort(a,n);
for(int i=1;i<=n;i++) cout << a[i] << ' ';
return 0;
}