# 堆排序（可以作为模板）

#include <cstring>
#include <cstdio>
#include <algorithm>
#include <iostream>
using namespace std;

void heapAdjust ( int a[], int i, int size )
{
int left_size = 2*i;
int right_size = 2*i+1;
int cnt = i;

/*The rules of large Root Sort   大根堆的规则*/
if ( i <= size/2 )
{
if ( left_size <= size && a[left_size] > a[cnt] )
cnt = left_size;
if ( right_size <= size && a[right_size] > a[cnt] )
cnt = right_size;

if ( cnt != i )
{
swap( a[i], a[cnt] );
heapAdjust ( a, cnt, size );
}
}
}

void buildHeap ( int a[], int size )
{
int i;
for ( i = size/2;i > 0; i-- )
{
heapAdjust ( a, i, size );
}
}

void heapSort( int a[], int size )
{
int i;

/*To establish a large Root Sort under the initial state
建立初始状态下的大根堆*/
buildHeap ( a, size );

for ( i = size;i > 0; i-- )
{
swap ( a[1], a[i] );
heapAdjust ( a, 1, i-1 );
}
}

int main()
{
int size, i;
int a[100];

/*输入数据     Input data*/
scanf ( "%d", &size );
for ( i = 1;i <= size; i++ )
{
scanf ( "%d", &a[i] );
}

/*堆排序      Heap sort start*/
heapSort( a, size );

/*输出数据     Output data*/
for ( i = 1;i <= size; i++ )
{
printf ( i == size ? "%d\n" : "%d ", a[i] );
}
return 0;
}