以前學資料結構的時候,用的是嚴的書,對於堆這個結構的概念似懂非懂。往往過了一段時間後有不會。現在趁著再次學習資料結構的機會,結合網上的資料整理出自己對堆的理解。
二叉堆滿足二個特性:
2.每個結點的左子樹和右子樹都是乙個二叉堆(都是最大堆或最小堆)。
1.堆是完全二叉樹。
2.完全二叉樹通常用陣列儲存。
3.完全
二叉樹的節點與其左右子節點的關係:
左子結點的編號=父結點編號 * 2;
右子結點的編號=父結點編號 * 2 + 1;
4.堆的儲存結構:
陣列儲存,因為陣列第乙個編號為0,
按照陣列標的編號,有類似的對應關係:
左子結點的陣列索引號= 父結點索引號 * 2+1;
右子結點的陣列索引號=父結點索引號 * 2 +2;
定義:
1.比較當前結點和它的子結點,如果當前結點小於它的任何乙個子結點,則和最大的那個子結點交換。否 則,當前過程結束。
2.在交換到新位置的結點重複步驟1,直到葉結點。
3.這裡要注意的是:為什麼從(i-1)/2開始調整:
首先從樹結構的最後乙個節點開始調整堆是無意義的,因為這些結點很顯然是葉結點,也就是說它們根本就沒有 子結點,連找子結點和去比較的必要都沒有了。所以,我們可以忽略這些沒有子結點的結點,從後往前找到 第乙個擁有子結點的結點,然後從這結點開始向前乙個個的進行堆調整。
4.從哪個結點開始進行調整
最後的乙個元素也肯定就是最終的乙個葉結點。那麼取它的父結點應該就是有子結點的最大號的元素了。那麼 從它開始就是最合適的。取它的父結點可以通過乙個簡單的(i -1)/ 2來得到,i為當前結點的下標。
void buildminheap(struct minheap* minheap)
1 資料
排序 堆排序(heapSort)
時間複雜度 o nlog n 空間複雜度 o 1 不穩定 把此序列對應的二維陣列看成乙個完全二叉樹。那麼堆的含義就是 完全二叉樹中任何乙個非葉子節點的值均不大於 或不小於 其左,右孩子節點的值。由上述性質可知大頂堆的堆頂的關鍵字肯定是所有關鍵字中最大的,小頂堆的堆頂的關鍵字是所有關鍵字中最小的。因此...
堆排序練習(Heap Sort
一.目的以及背景知識 進行堆排序練習,掌握堆的構建與輸出。堆定義 對於序列a 1,n 對於任意i都有a i a 2i a i a 2 i 1 則該序列稱為大頂堆或者最大堆。反之則成為最小堆。堆篩選或堆調整 從最後乙個葉子結點開始篩選出該節點的兄弟結點與父節點中最大或最小的元素與父節點交換。建堆演算法...
堆排序(HeapSort)詳解
用法區別 由以上特點我們可以得到堆的特性 將待排序序列,構成乙個大頂堆 此時,最大值為根節點 索引 0 將最大值與末尾元素交換 將剩餘的len 1個元素,繼續構造成乙個大頂堆 重複以上2 3步驟 找到那個 最深 最右 的非葉子節點 從右至左,從上至下構建大頂堆,呼叫adjustheap 方法 adj...