AcWing 838 堆排序
文章目录
🤖 作者简介: w20,自律才有自由 ⭐⭐⭐
输入:
5 3
4 5 1 3 2
输出:
1 2 3
//AcWing 838 堆排序
#include<iostream>
#include<algorithm>
#include<string>
using namespace std;
typedef long long ll;
const int N= 10010;
int n;
int ph[N],hp[N],h[N],size;
//ph[k]表示表示第k个插入的点在堆中的位置,hp[k]表示k是第几个插入到堆中的
//h[k]存储堆中的值,h[1]是堆顶,2x是左儿子,2x+1是右儿子
void heap_swap(int a,int b)
{
swap(ph[hp[a]],ph[hp[b]]);
swap(hp[a],hp[b]);
swap(h[a],h[b]);
}
void down(int u)
{
int t=u;
if(u*2 <=n &&h[t]>h[u*2])t=2*u;
if(u*2+1 <=n &&h[t]>h[u*2+1])t=2*u+1;
if(u!=t)
{
heap_swap(u,t);
down(t);
}
}
void up(int u)
{
while(u/2 && h[u]<h[u/2])
{
heap_swap(u,u/2);
u>>=1;
}
}
void create_heap()//构建堆,构建成最小堆
{
for(int i=n/2;i;i--)
{
down(i);
}
}
void delete_heap()//删除堆顶,重构堆
{
heap_swap(1,size--);
down(1);
}
int main()
{
int m;
cin>>n>>m;
size=n;
for(int i=1;i<=n;i++)
{
cin>>h[i];
}
create_heap();
while(m--)
{
cout<<h[1]<<' ';
delete_heap();
}
}