您好,登錄后才能下訂單哦!
堆的向下調整(siftDown):為了滿足小堆的性質,即任意結點的值都小于其子樹中結點的值,因此需要對指定結點進行向下調整,代碼如下:
//size是數組的大小,index是需要向下調整的元素的下標
public void siftDown(int[] array, int size, int index) {
int left = (index << 1) + 1;
//堆是完全的二叉樹,如果沒有左節點,那么必定沒有右節點,因此以左節點作為先決條件
while(left < size) {
//先假定最小的值時左節點的值
//原因:進入循環左節點必定存在,然后再判斷右節點是否存在,
//不存在的話最小值肯定是左節點,如果存在的話,只有當右節點的值小于左節點時才會讓最小值時右節點的值
int min = left;
int right = (index << 1) + 2;
//只有右節點存在且小于左節點的值時才進入循環
if(right < size && array[right] < array[left]) {
min = right;
}
//如果兩子節點中的最小值都大于他本身的值時,調整結束
if(array[min] >= array[index]) {
break;
}
//交換指定節點和其子節點中最小值的節點
int tmp = array[index];
array[index] = array[min];
array[min] = tmp;
//調整后下標是min的結點等待繼續調整
index = min;
left = (index << 1) + 1;
}
}
//此處size是數組最后一個元素的下標
public void heapify(int[] array, int size) {
for (int i = (size - 1) >> 1; i >= 0; i--) {
new SiftDown().siftDown(array, size, i);
}
}
3.下述為PriorityQueue在構建堆時的源碼:
//其中size表示的是數組中元素的個數,因此和上面構建代碼中的循環條件有所差別,但是本質表達的是一個意思
private void heapify() {
for (int i = (size >>> 1) - 1; i >= 0; i--)
siftDown(i, (E) queue[i]);
}
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。