#include <stdio.h>
#define TRUE 1
#define FALSE 0
typedef struct
{
int key;
}RecordType;
void sift(RecordType r[],int k,int m)//调整堆
{
int finished ;
RecordType t = r[k];
int x = r[k].key;
int i = k;
int j = 2*i;
finished = FALSE;
while(j<=m && !finished)
{
if(j<m && r[j].key<r[j+1].key)
j=j+1;
if(x>=r[j].key)
finished = TRUE;
else
{
r[i] = r[j];
i = j;
j = 2*i;
}
r[i]=t;
}
}
void crt_heap(RecordType r[],int length)//创建堆
{
int i;
int n = length;
for(i=n/2;i>=1;--i)
sift(r,i,n);
}
void HeapSort(RecordType r[],int length)//堆排序
{
int n,i;
RecordType b;
crt_heap(r,length);
n = length;
for(i=n;i>=2;--i)
{
b=r[1];
r[1]=r[i];
r[i]=b;
sift(r,1,i-1);
}
}
void main()
{
RecordType r[100];
int n;
int i;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%d",&r[i].key);
}
HeapSort(r,n);
for(i=1;i<=n;i++)
printf("%d ",r[i].key);
printf("\n");
}