题目:
题解:
在已给出的序列上建堆采用线性建堆法,将所有非叶子节点向下调整。
堆排序:
每次都将堆中最大值或最小值拿出来形成的序列就是堆排序后的序列。
代码:
#include<bits/stdc++.h>
using namespace std;
const int N=100010;
int si,m;
int h[N];
void down(int x){
int t=x;
if(x*2<=si&&h[t]>h[x*2])t=x*2;
if(x*2+1<=si&&h[t]>h[x*2+1])t=x*2+1;
if(t!=x){
swap(h[t],h[x]);
down(t);
}
}
int main(){
scanf("%d%d",&si,&m);
for(int i=1;i<=si;i++)scanf("%d",h+i);
//线性建堆法
for(int i=si/2;i;i--)down(i);
while(m--){
printf("%d ",h[1]);
h[1]=h[si--];
down(1);
}
return 0;
}