基本原理
堆可以看成一顆完全二叉樹,這課完全二叉樹的任何一個非葉節點的值都大於(或不小於)其左右孩子結點的值。
應用場景:
設有5000個元素,希望用最快的速度挑選出前10個最大的,採用堆排序方法最好。
因爲堆排序不必將整個序列排序即可確定前若干個最大(或最小)元素。
大頂堆:堆頂的元素值最大,並且每棵子樹都是一個大頂堆。(降序)
小堆頂:堆頂的元素值最小,並且每棵子樹都是一個小頂堆。(升序)
大頂堆排序步驟
原始序列:49 38 65 97 76 13 27 49
一、建堆
1、構建原始序列對應的完全二叉樹
2、從下向上檢查調整樹結構。
(1)檢查97,發現它和的孩子滿足堆定義,故不需要調整。
(2)檢查65,發現它和的孩子滿足堆定義,故不需要調整。
(3)檢查38,發現38<97,38<76,不滿足堆定義,故需要調整。
因此,將38和97交換。交換後38成了49的根節點,49>38,不滿足堆定義,需要繼續調整
將38和49交換。
(4)檢查49,49<97,49<65不滿足堆定義,需要調整,將49和97交換,交換後49<76仍不滿足堆定義,
繼續調整將49與76交換。
3、排序
至此,已經建立好了一個大頂堆。對應的序列爲
97 76 65 49 49 13 27 38
第一趟堆排序完成,97到達其最終位置。
然後繼續交換堆頂元素與當前末尾元素,反覆執行調整+交換步驟,直到整個序列有序。