加在尾部的元素壹定是葉節點,這裏是a[n+1],假設它的下標是k。
父節點下標為k/2,大根堆中父節點的值必須大於等於子節點。
因此,向上調整a[k]並不斷與其父節點進行比較。如果它大於父節點,將向下復制父節點。
直到a[k]小於或等於其父節點,然後將a[n+1]的值插入a[k]的當前位置。
參考代碼如下:
可以看到,插入過程正好與圖2中HeapAdjust()的方向相反,壹個向上調整,壹個向下調整。
源代碼是:
//向上調整大根堆中的葉節點a[k]。
void MaxHeapFixup(int a[],int k) {
a[0]= a[k];// a[0]臨時保存a[k]的值
int I;// a[i]是a[k]的父節點
for(I = k/2;我& gt= 1;i = i/2) {
if(a[I]& gt;= a[k]) //如果父節點不小於其子節點,則找到插入位置。
打破;
否則{
a[k]= a[I];//否則,將較小父節點的值向下復制到其子節點。
k = I;
}
}
a[k]= a[0];//將葉節點插入當前滿足大根堆條件的位置。
}
//在根堆中插入新元素num,默認情況下插入到最後壹個位置。
void maxheapadnum(int a[],int n,int num) {
a[n+1]= num;
MaxHeapFixup(a,n+1);
}