堆排序


def find_max(arr, size):
    # 從后往前遍歷
    # 父節點為i 子結點為2i+1 和 2i+2
    for i in range(size-1, 0, -1):
        # 記錄父節點
        parent = i//2
        # 記錄子節點
        child = i
        # 比較子節點大小
        if i < size-1 and arr[i] < arr[i+1]:
            child += 1
        if arr[child] > arr[parent]:
            # 把子節點跟父節點交換
            arr[child], arr[parent] = arr[parent], arr[child]


def heap_sort(arr, size):
    for i in range(size, 0, -1):
        # 找到最大值
        find_max(arr, i)
        print(arr, '---')
        # 把最大值往后放
        arr[0], arr[i-1] = arr[i-1], arr[0]
        print(arr, '===')

if __name__ == "__main__":
    l = [3, 1, 4, 9, 6, 10, 5, 8, 2, 7]
    heap_sort(l, 10)
    print(l)
    
# [10, 3, 9, 1, 7, 4, 5, 8, 2, 6] ---
# [6, 3, 9, 1, 7, 4, 5, 8, 2, 10] ===
# [9, 6, 8, 3, 7, 4, 5, 1, 2, 10] ---
# [2, 6, 8, 3, 7, 4, 5, 1, 9, 10] ===
# [8, 2, 7, 5, 6, 4, 3, 1, 9, 10] ---
# [1, 2, 7, 5, 6, 4, 3, 8, 9, 10] ===
# [7, 1, 6, 5, 2, 4, 3, 8, 9, 10] ---
# [3, 1, 6, 5, 2, 4, 7, 8, 9, 10] ===
# [6, 3, 5, 1, 2, 4, 7, 8, 9, 10] ---
# [4, 3, 5, 1, 2, 6, 7, 8, 9, 10] ===
# [5, 4, 3, 1, 2, 6, 7, 8, 9, 10] ---
# [2, 4, 3, 1, 5, 6, 7, 8, 9, 10] ===
# [4, 2, 3, 1, 5, 6, 7, 8, 9, 10] ---
# [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] ===
# [3, 1, 2, 4, 5, 6, 7, 8, 9, 10] ---
# [2, 1, 3, 4, 5, 6, 7, 8, 9, 10] ===
# [2, 1, 3, 4, 5, 6, 7, 8, 9, 10] ---
# [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] ===
# [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] ---
# [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] ===
# [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM