堆排序(Heap Sort)
概念
堆在樹中是一個完成二叉樹 堆分爲大頂堆和小頂堆 大頂堆: 非葉子結點的值大於或等於其左右孩子結點 小頂堆: 非葉子結點的值小於或等於其左右孩子結點 特徵: 堆的根結點的值肯定是極值
堆排序的實現步驟
構建完全二叉樹 將此完全二叉樹調整爲堆 根據堆的特性,使用選擇排序
構建完全二叉樹:
待排序數字爲30,20,80,40,50,10,60,70,90
用什麼數據類型存儲,且如何和完全二叉樹的特性構建關聯?
使用列表存儲數據,層序遍歷完全二叉樹,使用完全二叉樹的性質5可以知曉
父結點的索引.
構造一個列表[0,30,20,80,40,50,10,60,70,90],添0是爲了方便控制.
調整二叉樹爲堆(大頂堆):
從哪開始調整?
從哪個結點開始?
從完全二叉樹的最後一個結點的父節點開始
下一個結點是誰?
從起始結點開始向左找其同層結點,到頭後再從上一層的最右邊結點開始
繼續向左逐個查找,直至根結點.
調整方法?
根據完全二叉樹性質,父節點爲n,左孩子結點爲n//2,右孩子結點爲n//2+1
首先比較左右孩子結點大小,取得它們最大值,再將父節點與此最大值進行
比較,從而判斷是否調整.
選擇排序
調整好的大頂堆,其根結點是最大值.因此可以使用選擇排序,將其極值抓取, 從而排好序. 如何選擇,怎麼處理? 每次將調整好的大頂堆根結點值,與最後一個葉子結點值交換.並將除最大值 以外的完全二叉樹重新調整爲大頂堆. 每次拿走最大值後的完全二叉樹,從哪個結點進行調整? 此時可以直接從根結點開始調整,由於第一次調整過的原因.
堆排序的總結:
時間複雜度:
堆排序跟序列開始的順序無關,因此最差和最好情況都一樣.其時間複雜度都爲O(nlogn).
空間複雜度 :
元素根據索引賦值,其內存空間的大小不變.空間複雜度O(n)
穩定性:
不穩定