#include<bits/stdc++.h>
using namespace std;
int n,a[1000005],k=1,top;
vector<int>ans;
void adjust(int i)
{
if(i>n)return;
int j;
if(a[i*2+1]>a[i*2])j=i*2+1;
else j=i*2;
if(a[i]>a[j])
{
return;
}
else
{
swap(a[i],a[j]);
adjust(j);
}
}
void zd()//造堆
{
for(int i=n/2;i>=1;i--)
{
adjust(i);
}
}
void px()//排序
{
for(int i=1;i<=n;i++)
{
//cout<<a[top]<<endl;
// cout<<top<<endl;
ans.push_back(a[1]);
// a[1]=a[top];
swap(a[1],a[top]);
top--;
adjust(1);
// for(int i=1;i<=n;i++)cout<<a[i]<<' ';
// cout<<endl;
}
}
int main(){
cin>>n;
for(int i=1;i<=n;i++)cin>>a[i];
zd();
top=n;
// for(int i=1;i<=n;i++)cout<<a[i]<<' ';
// cout<<endl;
// adjust(2);
px();
for(int i=ans.size()-1;i>=0;i--)cout<<ans[i]<<" ";
return 0;
}
用的堆排序,麻烦daolao看一下