#include <stdio.h>
#include <stdlib.h>
int length;
int a[100001];
void Exchange(int *a,int *b)
{
int temp=*a;
*a=*b;
*b=temp;
}
void Min_Heapify(int a[],int i)//保持最小堆性
{
int l=i*2,r=i*2+1,min;
if(l<=length&&a[l]>a[i])
min=l;
else
min=i;
if(r<=length&&a[r]>a[min])
{
min=r;
}
if(min!=i)
{
Exchange(&a[i],&a[min]);
Min_Heapify(a,min);
}
}
void Build_Min_Heap(int a[])//建堆
{
int i;
for(i=length/2;i>=1;i--)
{
Min_Heapify(a,i);
}
}
void HeapSort(int a[],int n)//堆排序
{
int i;
Build_Min_Heap(a);//堆一次,即每次取最小值
for(i=n;i>=2;i--)
{
Exchange(&a[1],&a[length]);
length-=1;
Min_Heapify(a,1);
}
}
int main()
{
int n,i;
scanf("%d",&n);
length=n;
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
HeapSort(a,n);
for(i=1;i<=n;i++)
printf("%d ",a[i]);
printf("\n");
return 0;
}