堆排序堆排序是指利用堆這種資料結構所設計的一種排序演算法。堆是乙個近似完全二叉樹的結構,並同時滿足堆的性質:即子節點的鍵值或索引總是小於(或者大於)它的父節點,堆排序的時間複雜度為o(nlogn)。(來自維基百科)
什麼是堆
堆是一種特殊的完全二叉樹,它的性質為:任意節點大於等於或者小於等於它的左右節點。如果任意節點大於等於它的左右節點,此堆稱為最大堆;反之,任意節點小於等於它的左右節點,此堆稱為最小堆。
堆節點的訪問
堆排序的基本思路
無序的堆序列
將每個父節點跟左右子節點作比較,將大/小的子節點和父節點做交換,直到將堆變成最小堆或者最大堆
將堆頂的值跟未排序的二叉樹最後的乙個節點做交換
重複步驟(2,3),直到堆頂
堆排序的步驟分解
無序的序列:,進行從大到小排序
上圖是構建乙個初始化的最大堆,然後對堆頂和堆尾的數值作交換。
我們先對比(1)堆,從最後乙個父節點開始,節點2的值都比子節點5,6都大,不需要做調整;節點1的值都比子節點3,4都大,也不需要作交換;節點0的值比左右子節點都小,然後取最大的乙個子節點,(2)堆表示作交換,子節點做了交換,需要判斷它的子節點是否比自己大,節點4比節點1的大(因節點4比節點3要大,故取節點4做交換),(3)堆表示做交換。(4)堆完成了初始化的最大堆。(5)堆進行堆頂和堆尾的交換。
接下來的操作就是重複上述的流程,直到堆頂為止,看下圖的流程:
以上就是完整演算法的流程。
堆排序的實現**
void
myswap
(int
&a,int
&b)void
maxhead
(int
*parraynum,
int nstart,
int nend)
//判斷父節點與子節點的大小
if(parraynum[ns]
> parraynum[nf]
)else}}
void
heapsort
(int
*parraynum,
int ncount)
//將堆頂的值與未排序的堆尾值做互換,然後再做堆構建
資料結構與演算法 堆排序
1 堆的性質 堆是一棵完全二叉樹,除最後一層外每層都是滿的 元素個數為2 i 1 根節點為第1層 最後一層如果不滿則只缺少右邊葉結點。如果按照廣度優先,即從上至下,從左至右對節點編號。根節點序號為0,節點i的父節點是 i 1 2,左子節點是2 i 1。最小堆中任意父節點不能比子節點大,最大堆中任意父...
資料結構與演算法 堆排序
基礎概念 堆排序是利用堆這種資料結構而設計的一種排序演算法,堆排序是一種選擇排序,它的最壞,最好,平均時間複雜度均為o nlogn 它也是不穩定排序。通俗理解 將待排序序列構造成乙個大頂堆,此時,整個序列的最大值就是堆頂的根節點。將其與末尾元素進行交換,此時末尾就為最大值。然後將剩餘n 1個元素重新...
資料結構與演算法 堆排序
目錄堆排序 heapsort 是指利用堆這種資料結構所設計的一種排序演算法。堆積是乙個近似完全二叉樹的結構,並同時滿足堆積的性質 即子結點的鍵值或索引總是小於 或者大於 它的父節點。堆排序可以說是一種利用堆的概念來排序的選擇排序。分為兩種方法 大頂堆 每個節點的值都大於或等於其子節點的值,在堆排序演...