堆节点的插入:
void PercolateUp( int p, PriorityQueue H ){ //插入时,小的数字向上调整
int i;
int temp=H->Elements[p];
for(i=H->Size;temp<H->Elements[i/2]&&i>1;i/=2){ //当插入的数字小于父节点则向上调整
H->Elements[i]=H->Elements[i/2];
}
H->Elements[i]=temp;
}
堆节点的删除:
void PercolateDown( int p, PriorityQueue H ){ //删除调整节点时,将该节点下沉到末尾
int temp=H->Elements[p];
int parent,son;
for(parent=p;parent*2<=H->Size;parent=son){
son=parent*2;
if(son<H->Size&&H->Elements[son]>H->Elements[son+1]){
son++; //当孩子节点有兄弟的时候,判断当前孩子节点和右兄弟的大小
}
if(temp<=H->Elements[son])
break; //当前节点重新形成小根堆则结束
else
H->Elements[parent]=H->Elements[son];
}
H->Elements[parent]=temp;
}