Status Insert_HeapBuilding(HeapType &H,RedType E){//小顶堆
H.length++;
H.r[H.length] = E; //首先安排在最后
if(H.length == 1) return OK;
son = H.length;
father = H.length / 2;
if(H.length == 2){
if(H.r[son].key < H.r[father].key)
swap(H.r[son],H.r[father]);
return OK;
}//if
//两种特殊情况,以下是超过2个元素的情况
if(son == 2*father){
if(H.r[son].key < H.r[father].key){
swap(H.r[son],H.r[father]);
son = father; father /= 2;
}
else return OK;
}//还需要一点处理
while(1){
while(H.r[son].key < H.r[father].key &&
H.r[son].key <= H.r[2*father].key &&
H.r[son].key <= H.r[2*father + 1].key
){
swap(H.r[son],H.r[father]);
son = father; father /= 2;
}//然后向上推到不能继续代替其父
if(H.r[son].key >= H.r[father].key) return OK; //如果是因为与其父关系不能推进,则以满足堆定义
else{ //否则说明他是小于其父而大于其兄,此时其兄即为三者最小值
if(son == 2*father) swap(H.r[father],H.r[son + 1]);
else swap(H.r[father],H.r[son - 1]);
}//else
//现在还有可能就是现在的father不满足堆定义
if(father = 1) return OK;
son = father;
father /= 2;
}//while
}//Insert_HeapBuilding
逐个插入建堆
最新推荐文章于 2024-02-08 18:09:57 发布