堆排序演算法之python3實現

2021-10-07 13:14:03 字數 1390 閱讀 9043

"""

堆排序"""

# 向下調整的函式,傳入的資料為堆,堆頂節點的編號和堆末尾的界限值

defheapify

(heap, start, end)

: father = start

son = father *

2# son儲存較大的子節點的編號,初始化為左子節點

while end >= son:

# 當目前資料所處的節點還有子節點時,繼續迴圈調整

# 存在子節點且左右節點進行比較

if end >= son +

1and heap[son +1]

> heap[son]

:# 如果存在右節點且其值大於左子節點的值,son儲存右子節點的編號

son +=

1if heap[son]

> heap[father]

:# 如果子節點值大於父節點值

# 進行值的交換

heap[father]

, heap[son]

= heap[son]

, heap[father]

# 繼續進行下一層調整

father = son

son = father *

2else

:# 如果所有父節點大於等於子節點,則交換完成

return

defheapsort

(heap)

:# 初始化最大頂函式

heap.insert(0,

0)# 堆頂編號從0開始,在位置0處插入乙個數使得堆中元素的編號與在陣列中的下標一樣

for i in

range

(len

(heap)-1

//2,0

,-1)

:# 從最底層最右側的非葉子節點開始調整

heapify(heap, i,

len(heap)-1

)# 從堆末尾開始進行元素交換

for i in

range

(len

(heap)-1

,0,-

1): heap[1]

, heap[i]

= heap[i]

, heap[1]

heapify(heap,

1, i-1)

return heap

if __name__ ==

'__main__'

: test_list =[11

,6743

,4656

,2321,12

,54,876

,232

]print

(heapinit(test_list)

)

堆排序python3實現

堆排序的思想 先將無序陣列調整為大頂堆 小頂堆,然後將堆頂元素r0和最後乙個孩子節點rn交換位置,此時r0 rn 1是無序的,rn是有序的,繼續迭代,將r0 rn 1調整為大頂堆 小頂堆,然後將堆頂元素r0和rn 1交換位置,迭代到堆中只剩下乙個元素為止 def heapfiy nums,n,i l...

堆排序演算法講解 及python3實現

將初始待排序關鍵字序列 r1,r2.rn 構建成大頂堆,此堆為初始的無序區 將堆頂元素r 1 與最後乙個元素r n 交換,此時得到新的無序區 r1,r2,rn 1 和新的有序區 rn 由於交換後新的堆頂r 1 可能違反堆的性質,因此需要對當前無序區 r1,r2,rn 1 調整為新堆,然後再次將r 1...

python3堆排序 python 堆排序

堆排序 堆排序 heapsort 是指利用堆這種資料結構所設計的一種排序演算法。堆積是乙個近似完全二叉樹的結構,並同時滿足堆積的性質 即子結點的鍵值或索引總是小於 或者大於 它的父節點 但是不保證所有左子樹比右子樹小反之亦然 堆排序可以說是一種利用堆的概念來排序的選擇排序。分為兩種方法 大頂堆 每個...