堆排序演算法建立在完全二叉樹的陣列表示形式之上,可分為大根堆和小根堆兩種,分別可對應陣列的從小到大排序和從大到小排序。本文程式以大根堆為例。在學習堆排序演算法之前,需要了解到:
1、完全二叉樹的陣列表示形式中,父節點 i 的左右子節點分別為2 *i + 1和 2 * i + 2。
2、大根堆中父節點均比子節點大。
堆排序演算法主要有兩步:
1、針對輸入的無序陣列,構造初始大根堆;
2、大根堆中,堆頂為當前堆中最大值,將其數值與堆中最後乙個節點數值進行交換,然後捨棄最後乙個節點,重新構造剩餘節點的大根堆。
程式中,需要不斷重複步驟2直至堆中只剩最後乙個節點。
#init_heap函式對應步驟1:初始化,構建大根堆。而要構建大根堆,
#需要從堆中的最後乙個父節點,即self.size//2-1,從後往前遍歷,
#當子節點的值比父節點大時,即交換
#heap_sort函式對應步驟2,其中捨棄最後乙個節點後,重新構造剩餘
#節點大根堆通過繼續呼叫init_heap函式實現。
class
heap_sort
:def
__init__
(self,data)
: self.data = data
self.size =
len(data)
definit_heap
(self)
: n = self.size//2-
1for i in
range
(n,-1,
-1):
left =
2*i+
1 right =
2*i+
2if right<=self.size-1:
max_index = left if self.data[left]
>self.data[right]
else right
if self.data[max_index]
>self.data[i]
: self.data[max_index]
,self.data[i]
= self.data[i]
,self.data[max_index]
elif left<=self.size-1:
if self.data[left]
>self.data[i]
: self.data[left]
,self.data[i]
= self.data[i]
,self.data[left]
defheap_sort
(self)
: result =
self.init_heap(
) l = self.size
for i in
range
(l-2):
0]) self.data[0]
,self.data[self.size-1]
= self.data[self.size-1]
,self.data[0]
self.data.pop(
) self.size = self.size-
1 self.init_heap(
) result.extend(self.data)
return result
堆排序演算法的時間複雜度為o(nlogn)。 python堆排序演算法 Python 堆排序
python 堆排序 堆排序 heapsort 是指利用堆這種資料結構所設計的一種排序演算法。堆積是乙個近似完全二叉樹的結構,並同時滿足堆積的性質 即子結點的鍵值或索引總是小於 或者大於 它的父節點。堆排序可以說是一種利用堆的概念來排序的選擇排序。largest i l 2 i 1 left 2 i...
堆排序詳講
堆排序的時間,主要由建立初始堆和反覆重建堆這兩部分的時間開銷構成,它們均是通過呼叫heapify實現的 o n logn 排序 heapsort 是指利用堆積樹 堆 這種資料結構所設計的一種排序演算法,它是選擇排序的一種。可以利用陣列的特點快速定位指定索引的元素。堆分為大根堆和小根堆,是完全二叉樹。...
Python 堆排序演算法
堆排序演算法 空間複雜度為o 1 時間複雜度為o nlogn 演算法不穩定,不具有適應性 1 構造初始堆 對所有的非葉子節點進行篩選 小頂堆向下篩選,大頂堆向上篩選 2 進行堆排序 交換堆頂和最後乙個元素,最後乙個元素為有序區,剩下的為無序區,調整無序區,變成堆之後,堆無序區交換堆頂和最後乙個元素,...