2017-06-13 83 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)的

希望它能帮助!