#include<iostream>
#include<algorithm>
using namespace std;
void MinHeapFixdown(int a[], int i, int n)//调整堆
{
int j, temp;
temp = a[i];
j = 2 * i + 1;//i节点的左孩子节点
while (j < n)// 左孩子小于总数
{
if (j + 1 < n && a[j + 1] < a[j]) //在左右孩子中找最小的 右孩子节点小于左孩子
j++; //此时j是右孩子
//没有右孩子或者右孩子大于左孩子 最小的就是左孩子
if (a[j] >= temp) //最小的孩子节点大于父节点 就无需调整
break;
a[i] = a[j]; //把较小的子结点往上移动,替换它的父结点
i = j;//i更新为孩子节点
j = 2 * i + 1; //j更新为新的i的左孩子节点
}
a[i] = temp;//找到合适位置赋给a[i]
}
void MakeMinHeap(int a[], int n)//初始化最小堆
{
for (int i = n / 2 - 1; i >= 0; i--)
MinHeapFixdown(a, i, n);
}
void MinheapsortTodescendarray(int a[], int n)
{
for (int i = n - 1; i >= 1; i--)
{
swap(a[i], a[0]);
MinHeapFixdown(a, 0, i);
}
}
int main()
{
int a[100], n;
cin>>n;
for(int i = 0; i < n; i++)
{
cin>>a[i];
}
MakeMinHeap(a, n);
MinheapsortTodescendarray(a, n);
for(i = 0; i < n; i++)
cout<<a[i]<<' ';
return 0;
}