堆排序算法

堆排序(Heap Sort)

  • 概念

        堆在樹中是一個完成二叉樹
        堆分爲大頂堆和小頂堆
        大頂堆: 非葉子結點的值大於或等於其左右孩子結點
        小頂堆: 非葉子結點的值小於或等於其左右孩子結點
        特徵: 堆的根結點的值肯定是極值
  • 堆排序的實現步驟

        構建完全二叉樹
        將此完全二叉樹調整爲堆
        根據堆的特性,使用選擇排序
  • 構建完全二叉樹:

        待排序數字爲30,20,80,40,50,10,60,70,90
        用什麼數據類型存儲,且如何和完全二叉樹的特性構建關聯?
            使用列表存儲數據,層序遍歷完全二叉樹,使用完全二叉樹的性質5可以知曉
            父結點的索引.
        構造一個列表[0,30,20,80,40,50,10,60,70,90],添0是爲了方便控制.

spacer.gif

  • 調整二叉樹爲堆(大頂堆):

            從哪開始調整?
                從哪個結點開始?
                    從完全二叉樹的最後一個結點的父節點開始
                下一個結點是誰?
                    從起始結點開始向左找其同層結點,到頭後再從上一層的最右邊結點開始
                    繼續向左逐個查找,直至根結點.
            調整方法?
                根據完全二叉樹性質,父節點爲n,左孩子結點爲n//2,右孩子結點爲n//2+1
                首先比較左右孩子結點大小,取得它們最大值,再將父節點與此最大值進行
                比較,從而判斷是否調整.


    spacer.gif

  • 選擇排序

        調整好的大頂堆,其根結點是最大值.因此可以使用選擇排序,將其極值抓取,
        從而排好序.
        如何選擇,怎麼處理?
            每次將調整好的大頂堆根結點值,與最後一個葉子結點值交換.並將除最大值
            以外的完全二叉樹重新調整爲大頂堆.
        每次拿走最大值後的完全二叉樹,從哪個結點進行調整?
            此時可以直接從根結點開始調整,由於第一次調整過的原因.

spacer.gifspacer.gif

  •     堆排序的總結:

     

     時間複雜度:

          堆排序跟序列開始的順序無關,因此最差和最好情況都一樣.其時間複雜度都爲O(nlogn).

     空間複雜度 :

          元素根據索引賦值,其內存空間的大小不變.空間複雜度O(n)

     穩定性:

          不穩定


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