AcWing 838. 堆排序
原题链接
简单
作者:
少年纵马当长歌
,
2021-03-16 23:12:16
,
所有人可见
,
阅读 307
#include <iostream>
using namespace std;
const int N=100010;
int heap[N];//建堆从1开始 ,从0开始的话2*k和2*k+1都为0
int n,m,len;
void down(int u){
int t=u;
if(u*2<=len&&heap[t]>heap[u*2])t=u*2;
if(u*2+1<=len&&heap[t]>heap[u*2+1])t=u*2+1;
if(u!=t){
swap(heap[u],heap[t]);
down(t);
}
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){//建堆从1开始 ,从0开始的话2*k和2*k+1都为0
cin>>heap[i];
}
len=n;
for(int i=n/2;i>=1;i--){
down(i);
}
while(m--){
cout<<heap[1]<<" ";
heap[1]=heap[len];
down(1);
len--;
}
return 0;
}