這裏只談理論不談具體代碼實現
堆排序是一種選擇排序,關鍵是篩選。進行堆排序要先了解怎麼建立堆在瞭解堆調整。堆又分爲大根堆和小根堆,這裏以小根堆爲例。小根堆的每一個節點都要小於它的兩個左右子樹的根節點。
建立堆:先按照所給序列(從上到下從左到右)進行初始化成一個二叉樹,然後從最後一個非葉子結點開始調整
- 調整從第n/2個元素開始,將以該元素爲根的二叉樹調整爲堆
- 將以序號爲n/2-1的節點爲根的二叉樹調整爲堆
- 再將以序號爲n/2-2的節點爲根的二叉樹調整爲根
- 再以序號爲n/2-3的節點爲根的二叉樹調整爲堆
- …
*(這裏最後一步應該是n/2-1) *
堆調整: - 輸出堆頂元素之後,以堆中最後一個元素替代之;
- 然後將根 節點值與左右子樹的根節點進行比較,並與其中小者進行交換
- 重複上述操作,直至葉子結點,將新得到的對,稱這個對頂至葉子的調整過程稱爲篩選。大根堆思路一樣
這樣一步一步就完成了排序!