堆排序

    堆排序是一種很巧妙的排序方法,其原理是把數組當做一顆完全二叉樹,位置爲0的元素爲樹的根,位置爲n的元素,其左子節點的位置爲2n+1,右子節點的位置爲2n+2。

    堆按照數據的排列順序分爲最大堆和最小堆,堆的性質爲:最大堆的每個節點的值都不小於左右子節點的值,因此位置爲0的元素爲數值最大的元素,最小堆相反。

    堆排序的核心操作在於維護堆的上述性質,該操作稱爲heapify,既對任何節點n,檢查其是否滿足上述性質,若不滿足,在該節點與兩個子節點中找到最大元素m,與節點n交換,交換後,對於m節點繼續進行heapify操作,直到遍歷到葉節點。對於一個任意的數組,視其爲完全二叉樹,從下至上對所有內部節點進行heapify操作,堆便建立起來了。

    若要對某數組使用堆排序,首先要建立堆,按照升序排列便建立最大堆,按照降序排列便建立最小堆,建好堆後,將0位置的元素與數組最後一個元素進行交換,此時數組最後一個元素爲最大元素,然後對位置爲0的元素進行heapify操作,可保證前面所有元素組成的數組仍爲最大/最小堆,循環以上操作,數組就可以排序好。

    堆還可以用作優先級隊列。關於堆,《算法導論》中有詳細的論述。

 

    以下爲示例代碼,建立一個動態數組,隨機填充數據,然後進行堆排序,最後進行驗證。

    代碼僅供參考,某些分支未進行內存釋放,請無視。

    main函數代碼如下

    堆排序的時間複雜度爲O(nlgn),由此程序可以進行觀察。空間複雜度與樹的高度成正比。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章