AcWing 838. 堆排序
原题链接
简单
作者:
云_580
,
2024-09-10 14:38:54
,
所有人可见
,
阅读 1
#include<bits/stdc++.h>
using namespace std;
#define ls (x<<1)
#define rs (x<<1|1)
//这里注意加上括号;
const int N = 1e5+10;
int n,m,cnt;
int h[N];
void down(int x){
//找到最小值
int t = x;
if(ls<=cnt&&h[ls]<h[t])t=ls;
if(rs<=cnt&&h[rs]<h[t])t=rs;
if(t!=x){
swap(h[t],h[x]);
down(t);
}
}
int main(){
cin>>n>>m;
for(int i = 1;i<=n;i++)cin>>h[i];
cnt = n;
for(int i = n/2;i;i--)down(i);
for(int i = 1;i<=m;i++){
cout<<h[1]<<" ";
h[1]=h[cnt--];
down(1);
}
return 0;
}