//7.3堆排序
//堆排序 先用最小堆生成,然后从头读取当前最小后用最后一个替换在向下重排
#include<cstdio>
#include<cstdlib>
int h[101];
int n;
void swap(int x,int y)
{
int t;
t=h[x];
h[x]=h[y];
h[y]=t;
}
void siftdown(int i)
{
int t,flag=0;
while(i*2<n&&flag==0)
{
if(h[i]>h[i*2])
t=i*2;
else
t=i;
if(i*2+1<=n)
{
if(h[t]>h[i*2+1])
t=i*2+1;
}
if(t!=i)
{
swap(t,i);
i=t;
}
else
flag=1;
}
}
void siftup(int i)
{
int flag=0;
while(i!=1&&flag==0)
{
if(h[i]<h[i/2])
swap(i,i/2);
else
flag=1;
i=i/2;
}
}
int deletemax()
{
int t;
t=h[1];
h[1]=h[n];
n--;
siftdown(1);
return t;
}
void creatUp()
{
for(int i=n/2;i>=1;i--)
{
siftdown(i);
}
}
int main()
{
int i,num;
scanf("%d",&num);
for(i=1;i<=num;i++)
scanf("%d",&h[i]);
n=num;
creatUp();
for(i=1;i<=num;i++)
printf("%d ",deletemax());
return 0;
}
//堆排序 最大堆
#include<cstdio>
#include<cstdlib>
int h[101];
int n;
void swap(int x,int y)
{
int t;
t=h[x];
h[x]=h[y];
h[y]=t;
}
void siftdown(int i)
{
int t,flag=0;
while(i*2<n&&flag==0)
{
if(h[i]<h[i*2])
t=i*2;
else
t=i;
if(i*2+1<=n)
{
if(h[t]<h[i*2+1])
t=i*2+1;
}
if(t!=i)
{
swap(t,i);
i=t;
}
else
flag=1;
}
}
void siftup(int i)
{
int flag=0;
while(i!=1&&flag==0)
{
if(h[i]<h[i/2])
swap(i,i/2);
else
flag=1;
i=i/2;
}
}
void creatUp()
{
for(int i=n/2;i>=1;i--)
{
siftdown(i);
}
}
void heapsort()
{
while(n>1)
{
swap(1,n);
n--;
siftdown(1);
}
}
int main()
{
int i,num;
scanf("%d",&num);
for(i=1;i<=num;i++)
scanf("%d",&h[i]);
n=num;
creatUp();
heapsort();
for(i=1;i<=num;i++)
printf("%d ",h[i]);
return 0;
}