#include<iostream>
using namespace std;
const int maxn=100010;
int n,m,heap[maxn],sz;
void down(int u)
{
int t=u;
if(2*u<=sz&&heap[2*u]<heap[t]) t=2*u;//一定要和 heap[t] 比较才能找到最小值
if(2*u+1<=sz&&heap[2*u+1]<heap[t]) t=2*u+1;
if(t!=u)
{
swap(heap[u],heap[t]);
down(t);
}
}
void up(int u)
{
if(u/2&&heap[u/2]>heap[u])
{
swap(heap[u/2],heap[u]);
up[u/2];
}
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
scanf("%d",&heap[i]);
sz=n;
for(int i=(n+1)/2;i;i--)//堆的初始化 O(n)
down(i);
for(int i=1;i<=m;i++)
{
printf("%d ",heap[1]);
heap[1]=heap[sz--];//弹出堆顶
down(1);
}
return 0;
}
来源:CSDN
作者:该用户已被删除QAQ
链接:https://blog.csdn.net/qq_45288870/article/details/104102565