2017-06-13 85 views
0

我正在使用算法,特別是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

使它成爲一個堆後,它不一定是按降序排列。

堆只需要每個節點比其子節點更大(或更小,對於最小堆),但沒有提到子節點的順序,也沒有提到不同級別節點的關係(其中一個不是另一個的直接後代,參見下面的56)。這意味着,這也將是一個有效的堆:

 9 
/ \ 
    5  8 
/\ /
1 2 6 

[9, 5, 8, 1, 2, 6] 
1

對於你的問題

爲什麼交換需要在列表中降序已經排序?

定義:堆數據結構是一個完整的二叉樹,其屬性的根大於子元素(或更小)。

heapify()函數確保構建堆。在你的情況下,它恰好是從高到低。另一個案例是在杜基林的答覆中指出的,這個問題沒有按照順序排列。

在堆排序中,在第一次heapify()調用之後,我們只知道一件事。堆的根(數組中的第一個元素)是數組中的最大元素。因此,將它移動到它的位置(最後一個位置)並將數組大小減少1,然後再對所有元素應用相同的步驟。

的heapify()操作將是O(log n)的,因此O的總的複雜性(N log n)的

希望它能幫助!