#include<iostream>
const int SIZE_ARRAY = 101;
int heap[SIZE_ARRAY] = {0}; // 堆中元素
int n;//堆中元素个数
//交换函数
void heapSwap(int x,int y){
int temp;
temp = heap[x];
heap[x] = heap[y];
heap[y] = temp;
}
//向下调整函数
void siftDown(int i){//传入一个需要向下调整的节点编号
int t,flag = 0 ;//flag 标记师傅需要向下调整
//当i节点有儿子,并且需要继续调整就执行
while( i*2 <= n && flag == 0 ){
//首先判断他和左儿子的关系,并用t记录较大值的节点编号
if( heap[i] < heap[i*2] ){
t = i*2;
}else{
t = i;
}
//如果有有儿子
if( i*2+1 <= n ){
if(heap[t]<heap[i*2+1]){
t = i*2+1;
}
}
if(t!=i){
heapSwap(t,i);
i = t;
}
else
flag = 1;
}
}
//建立堆的函数
void creatHeap(){
int i;
//从最后一个非叶节点到第1个节点依次进行向上调整
for(i = n/2; i >= 1; i--){
siftDown(i);
}
}
//堆排序
void heapSort(){
while(n>1){
heapSwap(1,n);
n--;
siftDown(1);
}
}
int main(void){
int i,num;
std::cin>>num;
for(i=1;i<=num;i++)
std::cin>>heap[i];
n = num;
//建堆
creatHeap();
//堆排序
heapSort();
for(i=1; i<=num; i++)
std::cout<<heap[i]<<" ";
std::cout<<std::endl;
return 0;
}