標籤:堆排序 python
堆排序(Heap Sort)
堆在樹中是一個完成二叉樹 堆分為大頂堆和小頂堆 大頂堆: 非葉子結點的值大於或等於其左右孩子結點 小頂堆: 非葉子結點的值小於或等於其左右孩子結點 特徵: 堆的根結點的值肯定是極值
構建完全二叉樹 將此完全二叉樹調整為堆 根據堆的特性,使用選擇排序
待排序數字為30,20,80,40,50,10,60,70,90
用什麼資料類型儲存,且如何和完全二叉樹的特性構建關聯?
使用列表格儲存體資料,層序遍曆完全二叉樹,使用完全二叉樹的性質5可以知曉
父結點的索引.
構造一個列表[0,30,20,80,40,50,10,60,70,90],添0是為了方便控制.
650) this.width=650;" src="/e/u261/themes/default/images/spacer.gif" style="background:url("/e/u261/lang/zh-cn/images/localimage.png") no-repeat center;border:1px solid #ddd;" width="325" alt="spacer.gif" />
-
調整二叉樹為堆(大頂堆):
從哪開始調整?
從哪個結點開始?
從完全二叉樹的最後一個結點的父節點開始
下一個結點是誰?
從起始結點開始向左找其同層結點,到頭後再從上一層的最右邊結點開始
繼續向左逐個尋找,直至根結點.
調整方法?
根據完全二叉樹性質,父節點為n,左孩子結點為n//2,右孩子結點為n//2+1
首先比較左右孩子結點大小,取得它們最大值,再將父節點與此最大值進行
比較,從而判斷是否調整.
650) this.width=650;" src="/e/u261/themes/default/images/spacer.gif" style="background:url("/e/u261/lang/zh-cn/images/localimage.png") no-repeat center;border:1px solid #ddd;" width="301" alt="spacer.gif" />
調整好的大頂堆,其根結點是最大值.因此可以使用選擇排序,將其極值抓取, 從而排好序. 如何選擇,怎麼處理? 每次將調整好的大頂堆根結點值,與最後一個葉子結點值交換.並將除最大值 以外的完全二叉樹重新調整為大頂堆. 每次拿走最大值後的完全二叉樹,從哪個結點進行調整? 此時可以直接從根結點開始調整,由於第一次調整過的原因.
650) this.width=650;" src="/e/u261/themes/default/images/spacer.gif" style="background:url("/e/u261/lang/zh-cn/images/localimage.png") no-repeat center;border:1px solid #ddd;" width="569" alt="spacer.gif" />650) this.width=650;" src="/e/u261/themes/default/images/spacer.gif" style="background:url("/e/u261/lang/zh-cn/images/localimage.png") no-repeat center;border:1px solid #ddd;" width="569" alt="spacer.gif" />
時間複雜度:
堆排序跟序列開始的順序無關,因此最差和最好情況都一樣.其時間複雜度都為O(nlogn).
空間複雜度 :
元素根據索引賦值,其記憶體空間的大小不變.空間複雜度O(n)
穩定性:
不穩定
本文出自 “12064120” 部落格,請務必保留此出處http://12074120.blog.51cto.com/12064120/1976138
堆排序演算法