堆有最大堆和最小堆之分,最大堆就是每個節點的值都>=其左右孩子(如果有的話)值的完全二叉樹。最小堆便是每個節點的值都<=其左右孩子值的完全二叉樹。
設有n個元素的序列{k1,k2,...,kn},當且僅當滿足下列關系時,稱之為堆。
堆的三種基本操作(以下以最大堆為例):
⑴最大堆的插入
由于需要維持完全二叉樹的形态,需要先将要插入的結點x放在最底層的最右邊,插入後滿 足完全二叉樹的特點;
然後把x依次向上調整到合适位置滿足堆的性質,例如下圖中插入80,先将80放在最後,然後兩次上浮到合适位置.
時間:O(logn)。 “結點上浮”
程式實作:

View Code
⑵删除
操作原理是:當删除節點的數值時,原來的位置就會出現一個孔,填充這個孔的方法就是,
把最後的葉子的值賦給該孔并下調到合适位置,最後把該葉子删除。
如圖中要删除72,先用堆中最後一個元素來35替換72,再将35下沉到合适位置,最後将葉子節點删除。
“結點下沉”
程式:

⑶初始化
方法1:插入法:
從空堆開始,依次插入每一個結點,直到所有的結點全部插入到堆為止。
時間:O(n*log(n))
方法2:調整法:
序列對應一個完全二叉樹;從最後一個分支結點(n div 2)開始,到根(1)為止,依次對每個分支結點進行調整(下沉),
以便形成以每個分支結點為根的堆,當最後對樹根結點進行調整後,整個樹就變成了一個堆。
時間:O(n)
對如圖的序列,要使其成為堆,我們從最後一個分支結點(10/2),其值為72開始,依次對每個分支節點53,18,36 45進行調整(下沉).

(4)最大堆排序

(5)完整的代碼

轉自:http://www.java3z.com/cwbwebhome/article/article1/1362.html?id=4745