标签:优先 queue class 建堆 操作 heap c++ 表示 size
int h[N],siz;
//这两个数组存映射关系 ph[k]=i表示第k个插入的数对应堆中的编号为i
//hp[i] = k表示堆中编号为i的点是第k个插入的数 k从1开始
//一般用到的堆不需要复杂的交换 不需要存储映射
int ph[N],hp[N];
//节点交换函数 同时要修改映射关系
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)
{
//t是三个里面最小值的编号
int t = u;
if((u * 2) <=siz && h[u*2] < h[t]) t = u *2;
if((u * 2 + 1) <= siz && h[u * 2 + 1] < h[t]) t = u * 2 + 1;
if(u != t)
{
heap_swap(u,t);
down(t);
}
}
void up(int u)
{
while(u / 2 && h[u / 2] > h[u])
{
heap_swap(u / 2, u);
u /= 2;
}
}
for(int i=1;i<=n;i++) cin>>h[i];
siz = n;
//O(n)建堆
for(int i=n/2;i;i--) down(i);
标签:优先 queue class 建堆 操作 heap c++ 表示 size
原文地址:https://www.cnblogs.com/codertea/p/12801148.html