堆排序python3實現

2021-09-25 21:56:17 字數 945 閱讀 2990

堆排序的思想:先將無序陣列調整為大頂堆/小頂堆,然後將堆頂元素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...