我正在使用算法,特別是heapsort。根據我的理解,heapsort算法涉及通過首先將其轉化爲最大堆來準備列表。HeapSort - 交換前排序
車削我
[2,8,5,3,9,1]
進入
[9,8,5,3,2,1]
隨着堆排序我我應該把9與1交換。但是通過在最大堆積之後直接查看數組,我會看到一個排序順序排列的列表。爲什麼當列表已經按降序排列時需要交換?
這只是我的想法看後有: https://www.youtube.com/watch?v=2DmK_H7IdTo
我正在使用算法,特別是heapsort。根據我的理解,heapsort算法涉及通過首先將其轉化爲最大堆來準備列表。HeapSort - 交換前排序
車削我
[2,8,5,3,9,1]
進入
[9,8,5,3,2,1]
隨着堆排序我我應該把9與1交換。但是通過在最大堆積之後直接查看數組,我會看到一個排序順序排列的列表。爲什麼當列表已經按降序排列時需要交換?
這只是我的想法看後有: https://www.youtube.com/watch?v=2DmK_H7IdTo
使它成爲一個堆後,它不一定是按降序排列。
堆只需要每個節點比其子節點更大(或更小,對於最小堆),但沒有提到子節點的順序,也沒有提到不同級別節點的關係(其中一個不是另一個的直接後代,參見下面的5
和6
)。這意味着,這也將是一個有效的堆:
9
/ \
5 8
/\ /
1 2 6
[9, 5, 8, 1, 2, 6]
對於你的問題
爲什麼交換需要在列表中降序已經排序?
定義:堆數據結構是一個完整的二叉樹,其屬性的根大於子元素(或更小)。
heapify()函數確保構建堆。在你的情況下,它恰好是從高到低。另一個案例是在杜基林的答覆中指出的,這個問題沒有按照順序排列。
在堆排序中,在第一次heapify()調用之後,我們只知道一件事。堆的根(數組中的第一個元素)是數組中的最大元素。因此,將它移動到它的位置(最後一個位置)並將數組大小減少1,然後再對所有元素應用相同的步驟。
的heapify()操作將是O(log n)的,因此O的總的複雜性(N log n)的
希望它能幫助!