堆排序(Python實現)


堆排序(Heap Sort)

  • 是一棵具有以下性質的完全二叉樹

    • 大頂堆:每個結點的值都大於或等於其左右孩子結點的值
    • 小頂堆:每個結點的值都小於或等於其左右孩子結點的值
  • 堆排序的主要思想:

    • 將待排序列構造成一個大頂堆,此時堆頂元素就是整個序列的最大值,將堆頂元素與堆數組的末尾元素進行交換。然后將剩余的n-1個元素重新構造成一個堆,並得到整個序列的次大值。如此反復執行,得到一個有序的序列。
  • 復雜度分析

    • 時間復雜度:最好、最壞、平均都是O(nlogn)
    • 空間復雜度:O(1)
    • 不穩定
    • 不適合待排序列個數較少的情況

Python實現

# coding=utf-8


def heap_adjust(array, start, end):
    temp = array[start]
    child = 2 * start
    while child <= end:
        if child < end and array[child] < array[child + 1]:
            child += 1
        if temp >= array[child]:
            break
        array[start] = array[child]
        start = child
        child *= 2
    array[start] = temp


def heap_sort(array):
    # 從最后一個有孩子結點的結點開始調整最大堆
    first = len(array) // 2 - 1
    for start in range(first, -1, -1):
        heap_adjust(array, start, len(array) - 1)

    # 將最大的數放到堆的最后一個位置,並繼續調整排序
    for end in range(len(array) - 1, 0, -1):
        array[0], array[end] = array[end], array[0]
        heap_adjust(array, 0, end - 1)


if __name__ == "__main__":
    array = [1, 4, 5, 0, 2, 7, 9, 10, 3, 6]
    heap_sort(array)
    print(array)

參考資料

  1. 《大話數據結構》


免責聲明!

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



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