堆默认从数组下标为1开始存储。
const int N=201000;
int heap[N];
int len;
插入操作:
将元素插入到堆的末尾位置向上调整。
void up(int k){
while(k>1&&heap[k/2]>heap[k]){
swap(heap[k],heap[k/2]);
k/=2;
}
}
//len为当前存在元素长度
void Insert(int x){
heap[++len]=x;
up(len);
}
弹出堆顶元素:
将堆顶元素和堆中最后一个元素交换位置,将堆的长度减一再将新的堆顶元素向下调整。
void down(int k){
while(k+k<=len){
int j=k+k;
if(j+1<=len&&heap[j+1]<heap[j])j++;
if(heap[k]<=heap[j])break;
swap(heap[j],heap[k]);
k=j;
}
}
void pop(){
swap(heap[1],heap[len]);
len--;
down(1);
}
删除其中任意一个元素:
将该元素和队尾元素互换,如果队尾元素比该元素小尝试向上调整,如果队尾元素比该元素大尝试向下调整。
void Delete(int p){
if(p==len){
len--;
return ;
}
int x=heap[p],y=heap[len];
swap(heap[p],heap[len]);
len--;
if(y<x){
up(p);
}else {
down(p);
}
}