欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

堆的板子

程序员文章站 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;//令现在位置编号为左儿子编号 
	}
}
相关标签: 手写堆