堆排序(Python實現)
阿新 • • 發佈:2018-10-28
int 時間復雜度 pri 開始 堆排序 空間復雜度 繼續 末尾 小頂堆
堆排序(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)
參考資料
- 《大話數據結構》
堆排序(Python實現)