資料結構上的堆在物理上是乙個陣列,在邏輯上是乙個二叉樹。
大堆:根結點比孩子結點大;
小堆:根結點比孩子結點小;
堆化(向下調整)、向上調整的前提都是:在二叉樹中,只有乙個位置不滿足堆的性質,其它位置都滿足堆的性質。
向下調整 是讓調整的結點與其孩子節點進行比較
向上調整 是讓調整的結點與其父親結點進行比較
已知雙親的下標,則左孩子的下標為: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...