#include<iostream> #include<algorithm> #include<cstdio> #include<cstring> using namespace std; int a[1010]; void heapadjust(int s,int m) {//建立新堆 int temp,j; temp = a[s];//找最大值 for(j=2*s;j<=m;j*=2)//二叉树的性质五 {//求左孩子要乘2 if(j<m&&a[j]<a[j+1]) ++j;//此时右孩子为所求目标 if(temp>=a[j]) break; a[s]=a[j]; s=j; } a[s]=temp; } int main() { int n; scanf("%d",&n); memset(a,0,sizeof(a)); for(int i=1;i<=n;i++) scanf("%d",&a[i]); for(int i=n/2;i>0;i--) heapadjust(i,n);//首先n个元素建立堆 for(int i=n;i>1;i--) { swap(a[1],a[i]);//不停交换第一个与最后一个的位置,因为重新建立堆后,第一个又为最大值 heapadjust(1,i-1);//重新对i-1个元素建立堆 } for(int i=1;i<=n;i++) printf("%d ",a[i]); return 0; }