堆排序的思想:先將無序陣列調整為大頂堆/小頂堆,然後將堆頂元素r0和最後乙個孩子節點rn交換位置,此時r0-rn-1是無序的,rn是有序的,繼續迭代,將r0-rn-1調整為大頂堆/小頂堆,然後將堆頂元素r0和rn-1交換位置,迭代到堆中只剩下乙個元素為止.
def heapfiy(nums, n, i):
largest = i
l = 2 * i + 1 # 左孩子
r = 2 * i + 2 # 右孩子
# 父親節點和左孩子右孩子節點的值比較
if l < n and nums[i] < nums[l]:
largest = l
if r < n and nums[largest] < nums[r]:
largest = r
if largest != i:
nums[i], nums[largest] = nums[largest], nums[i]
heapfiy(nums, n, largest)
def heapsort(nums):
n = len(nums)
# 先將堆調整為大頂堆,從右向左從下往上的原則
for i in range(n-1, -1, -1):
heapfiy(nums, n, i)
# 始終將堆頂元素和最後乙個孩子節點交換位置,直到大頂堆只剩乙個元素為止
for i in range(n-1, 0, -1):
nums[i], nums[0] = nums[0], nums[i]
heapfiy(nums, i, 0)
if __name__ == '__main__':
nums = [4,5,2,7,9,10,0]
heapsort(nums)
n = len(nums)
print(nums)
python3堆排序 python 堆排序
堆排序 堆排序 heapsort 是指利用堆這種資料結構所設計的一種排序演算法。堆積是乙個近似完全二叉樹的結構,並同時滿足堆積的性質 即子結點的鍵值或索引總是小於 或者大於 它的父節點 但是不保證所有左子樹比右子樹小反之亦然 堆排序可以說是一種利用堆的概念來排序的選擇排序。分為兩種方法 大頂堆 每個...
堆排序演算法之python3實現
堆排序 向下調整的函式,傳入的資料為堆,堆頂節點的編號和堆末尾的界限值 defheapify heap,start,end father start son father 2 son儲存較大的子節點的編號,初始化為左子節點 while end son 當目前資料所處的節點還有子節點時,繼續迴圈調整 ...
堆排序演算法講解 及python3實現
將初始待排序關鍵字序列 r1,r2.rn 構建成大頂堆,此堆為初始的無序區 將堆頂元素r 1 與最後乙個元素r n 交換,此時得到新的無序區 r1,r2,rn 1 和新的有序區 rn 由於交換後新的堆頂r 1 可能違反堆的性質,因此需要對當前無序區 r1,r2,rn 1 調整為新堆,然後再次將r 1...