HeapSort - 在交换之前排序

时间:2017-06-13 12:36:56

标签: algorithm sorting heapsort max-heap

我正在使用算法,特别是heapsort。根据我的理解,heapsort算法涉及准备列表,首先将其转换为最大堆。

转动我的

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


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

使用heapsort我应该用1交换9.但是通过在最大堆积之后直接查看数组,我看到按降序排列的排序列表。当列表已按递减顺序排序时,为什么需要交换?

这只是我看完后的想法: https://www.youtube.com/watch?v=2DmK_H7IdTo

2 个答案:

答案 0 :(得分:5)

将它作为堆后,它不一定按降序排序。

堆只要求每个节点都比它的子节点更大(或者更小,对于最小堆),但是没有说明子节点的顺序,也没有说明不同级别节点的关系(其中一个节点不是对方的直接后代,请参阅下面的56。这意味着这也是一个有效的堆:

     9
   /   \
  5     8
 / \   /
1   2 6

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

答案 1 :(得分:1)

对于你的问题

  

为什么在列表已按递减顺序排序时需要进行交换?

根据定义:堆数据结构是一个完整的二叉树,其属性的根比它的子节点大(或小)。

heapify()函数保证堆的构造。在你的情况下,它恰好按降序排列。另一个案例是在Dukeling的回答中指出的,这不是降序。

在堆排序中,在第一次执行heapify()之后,我们只知道一件事。堆的根(数组中的第一个元素)是数组中的Max元素。因此,将其移动到其位置(最后位置)并将数组大小减小1并再次对所有元素应用相同的步骤。

heapify()操作将为O(log n),因此O(n log n)的总复杂度

希望它有所帮助!