篇首语:本文由编程笔记#小编为大家整理,主要介绍了838. 堆排序相关的知识,希望对你有一定的参考价值。
https://www.acwing.com/problem/content/840/
在进行down操作的时候,只需要让根节点和它的左右儿子结点比较就可以了。
#include
#include
#include<iostream>
using namespace std;
const int N&#61;1e5&#43;10;
int a[N],cnt;
void down(int u)
{
int t&#61;u;
if(u*2<&#61;cnt&&a[u*2]<a[t]) t&#61;u*2;
if(u*2&#43;1<&#61;cnt&&a[u*2&#43;1]<a[t]) t&#61;u*2&#43;1;
if(u!&#61;t)
{
swap(a[u],a[t]);
down(t);
}
}
int main(void)
{
int n,m; cin>>n>>m;
for(int i&#61;1;i<&#61;n;i&#43;&#43;) cin>>a[i];
cnt&#61;n;
for(int i&#61;n/2;i>&#61;1;i--) down(i);
while(m--)
{
cout<<a[1]<<" ";
a[1]&#61;a[cnt--];
down(1);
}
return 0;
}