堆積(Heap) 是一種特殊且完整的二元樹,可分為最大/小堆積樹兩種。最大堆積樹中所有節點的值都大或等於它左右子節點的值,這兩種樹的樹根(root)是其堆積樹中最大的;而最小堆積樹亦同理。而堆積排序法就需要建立或將二元樹換成堆積樹來做堆積排序演算法。而當需要取得升序(由小排到大)的節點排序,就需要建立最小堆積樹;反之,若需要取得降序(由大排到小)的節點排序,就需要建立最大堆積樹。以下範例將介紹如何將二元樹轉換成堆積樹、並且建立堆積樹後如何做堆積排序:
堆積排序法小Tips:
範例說明一:如何將一般二元樹轉換為堆積樹?(此題以最大堆積樹為例)
問題說明:假設有8筆資料34、19、40、14、57、17、4、43,我們以二元樹表示如下:
現在要將此二元樹轉換為最大堆積樹,我們可以用陣列來儲存二元樹所有節點A[0]=34、A[1]=19、A[2]=40、A[3]=14、A[4]=57、A[5]=17、A[6]=4、A[7]=43。
step1: 二元樹中最大的元素為A[4]=57,需要將其依序換至樹根的位置。先與A[1]=19交換,再與A[0]=34交換。
step2: 找到第二大的元素A[7]=43,先與A[3]=14交換,再與A[1]=34交換。
step3: 接下依序檢查第三大、第四大…等元素,發現皆小於其父節點,故無需更換。堆積樹完成!
範例說明二:(續範例一)如何將轉換好的堆積樹作堆積排序?
step1: 將57自樹根移除,重新建立堆積樹。
step2: 將43自樹根移除,重新建立堆積樹。
step3: 將40自樹根移除,重新建立堆積樹。
step4: 將34自樹根移除,重新建立堆積樹。
step5: 將19自樹根移除,重新建立堆積樹。
step6: 將17自樹根移除,重新建立堆積樹。
step7: 將14自樹根移除,重新建立堆積樹。
最後將4自樹根移除,得到排序為57、43、40、34、19、17、14、4。
優點:
缺點:
參考資料: