"""
堆排序"""
# 向下調整的函式,傳入的資料為堆,堆頂節點的編號和堆末尾的界限值
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 是指利用堆這種資料結構所設計的一種排序演算法。堆積是乙個近似完全二叉樹的結構,並同時滿足堆積的性質 即子結點的鍵值或索引總是小於 或者大於 它的父節點 但是不保證所有左子樹比右子樹小反之亦然 堆排序可以說是一種利用堆的概念來排序的選擇排序。分為兩種方法 大頂堆 每個...