堆排序 演算法及python程式詳解

2021-10-06 17:30:42 字數 1817 閱讀 8868

堆排序演算法建立在完全二叉樹的陣列表示形式之上,可分為大根堆和小根堆兩種,分別可對應陣列的從小到大排序和從大到小排序。本文程式以大根堆為例。在學習堆排序演算法之前,需要了解到:

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 進行堆排序 交換堆頂和最後乙個元素,最後乙個元素為有序區,剩下的為無序區,調整無序區,變成堆之後,堆無序區交換堆頂和最後乙個元素,...