堆 分爲 大根堆 和 小根堆,均是完全二叉樹
大根堆 要求每個內部節點的值大於其左右子節點的值
性質:由最大堆的要求來看,大根堆總能保證根節點是堆中值最大的。
堆排序算法就是根據大根堆的這種性質,
0)初始化二叉樹(堆)
1)調整堆使其爲全部元素( n個 )的大根堆
2)拿出根節點(n箇中最大值),調整剩餘的(n-1)個元素使其爲大根堆
3)拿出根節點(n-1箇中最大值),調整剩餘(n-2)個元素使其爲大根堆
。。。
。。。
這樣,每次拿出的元素都是剩餘元素中的最大者,也即拿出的元素在原始數組中
是最大者,次大者,次次大者,。。。這樣就完成了排序
【注】
0)初始化的過程個人感覺不是很重要,常見的做法是直接根據廣度優先的做法把數組中的元素排列到二叉樹中
1)調整堆的過程就是循環遍歷所有非葉子節點,調整使其值大於左右子節點,循環之後,形成新的大根堆
相關調整堆的過程參見,堆排序及其分析