堆的板子
程序员文章站
2024-03-18 11:38:40
...
#include<bits/stdc++.h>
void push(int x){
int now;
h[++h_size]=x;
now=h_size;
while(now>1&&h[now]<a[now>>1]){
swap(h[now],h[now>>1]);
now=now>>1;
}
}
void pop(){
h[1]=h[size--];
int now=1;//定义现在位置
while(now*2<=size){//当现在位置的儿子的编号没有超过总结点数时
int son=now*2;//左儿子编号为现在位置两倍
if(son+1<=size&&h[son+1]<h[son]) son++;//当存在右儿子并且右儿子小于左儿子 将左儿子变为右儿子 PS:使左儿子的值始终保持最小
if(h[now]<h[son]) break;//如果现在位置的权值比左儿子小,维护完成
swap(h[son],h[now]);//否则 交换左儿子与现在位置权值
now=son;//令现在位置编号为左儿子编号
}
}
上一篇: 数据结构——05队列
下一篇: 单生产者单消费者的环形队列