堆的向上調整 向下調整(堆化)

2021-09-20 12:44:29 字數 953 閱讀 1872

資料結構上的堆在物理上是乙個陣列,在邏輯上是乙個二叉樹。

大堆:根結點比孩子結點大;

小堆:根結點比孩子結點小;

堆化(向下調整)、向上調整的前提都是:在二叉樹中,只有乙個位置不滿足堆的性質,其它位置都滿足堆的性質。

向下調整 是讓調整的結點與其孩子節點進行比較

向上調整 是讓調整的結點與其父親結點進行比較

已知雙親的下標,則左孩子的下標為:left=2parent+1;

則右孩子的下標為:left=2parent+2;

已知孩子結點(不區分左右)的下標,則雙親的下標為:(child-1)/2;

向下調整

//堆化為大堆

//堆化(向下調整) 前提是 只有乙個地方不滿足堆的性質,其他位置都滿足堆的性質

private static void heapify(int array,int index)

//找出孩子結點中值最大的結點下標

if(max+1array[max])

//比較該根結點與最大的孩子結點的大小,如果孩子結點大,則換位置

if(array[index]結果為:

向上調整:

private static void adjustup(int array,int index)

//其父親結點

int parent=(index-1)/2;

//與父親結點相比較

//如果父親節點的值小,就交換位置,否則就不調整了

if(array[parent]結果為

基於向上調整與向下調整建堆

public class testdemo 經過if條件語句 不知道child指向的左右哪棵子樹,但指向的肯定是左右子樹中值較大的那個 下面判斷child位置的元素與parent位置的元素哪個大 如果不符合大堆的要求 child位置的元素 parent位置的元素 交換兩者的值 if array ch...

堆的向下調整以及建立

堆的向下調整 以小堆為例 1.先設定根節點為當前節點 通過下標來獲取 比較左右子樹的值,找出更小的值,用child來標記 2.比較child和parent的值,如果child比parent小,則不滿足小堆的規則,需要進行交換 3.如果child比parent大,滿足小堆的規則,不需要交換,調整就結束...

堆排序(向下調整建堆後再排序)

includeusing namespace std void adjustdown int int int void buildmaxheap int a,int len void adjustdown int a,int k,int len a k temp 找到了最終的位置並放入 void h...