AcWing 838. 堆排序
原题链接
简单
#include<iostream>
#include<algorithm>
using namespace std;
const int N=1e5+10;
int h[N],cnt;
void down(int u)
{
int t=u;
if(2*u<=cnt&&h[2*u]<h[t])
t=2*u;
if(2*u+1<=cnt&&h[2*u+1]<h[t])
t=2*u+1;
if(t!=u)
{
swap(h[u],h[t]);
down(t);
}
}
void up(int u)
{
while(u/2&&h[u]<h[u/2])
{
swap(h[u],h[u/2]);
u/=2;
}
}
int main()
{
int n,m;
cin>>n>>m;
cnt=n;
for(int i=1;i<=n;i++)
cin>>h[i];
for(int i=cnt/2;i;i--)
down(i);
while(m--)
{
cout<<h[1]<<" ";
h[1]=h[cnt];
down(1);
cnt--;
}
return 0;
}