降序排序

时间:2010-06-01 04:22:50

标签: heapsort

使用堆排序按降序排序,并显示步骤或解释 下面是树

                             79
                       33           57
                    8     25    48
下面是

阵列                                 79 - 33 - 57 - 8 - 25 - 48 ok升级很容易,因为最大元素在顶部我们可以交换最后一个元素和第一个元素然后使用heapify作为维基百科中的示例代码描述它。

好吧让我澄清一下,堆是建在我画的树上的。我知道升序的步骤和阵列看起来像8 - 25 - 33 - 48 - 57 - 79.但是下降的步骤是什么。这是一个非常直截了当的问题。只需解释按降序排列数组所需的步骤。

1 个答案:

答案 0 :(得分:2)

这看起来像一个最大heap,所以按降序排序是微不足道的:

FUNCTION descSortedFrom(Heap h) : Array

   LET N := h.size
   LET ret := NEW Array (size = N)

   FOR i = 0..N-1 DO
      ret[i] := h.deleteMax

   RETURN ret

二进制堆,二项堆和fibonacci堆都支持O(log N)中最大堆上的deleteMax(或类似地,在min heap上的deleteMin),所以总体来说这是O(N log N),这对于比较来说是最佳的 - 基于排序。

请注意,为简单起见,这使用外部存储阵列。如果你坚持使用与堆相同的数组,那么只需按照你的方式进行升序排序,然后(猜猜是什么?)在O(N)中反转数组。


另一种解决方案

这比必要的更复杂,但是是一次通过和就地。实质上,不是将数组元素[0..k)作为堆元素处理,而是采用[N-k..N)。您必须修改heapify以获取起始偏移量以适应此更改。

为了说明,正如您所知,这是按升序排序的方式:

entire array = [ the heap elements ; the sorted asc elements ]

基本上,您从右到左构建排序的asc元素,使用堆的最后一个元素交换堆的第一个(最大值),将堆大小缩小一个,然后堆积剩余的堆元素。

按降序排序在概念上是相同的:

entire array = [ the sorted desc elements ; the heap elements ]

您从左到右构建排序的desc元素。堆的最大值不需要重新定位,只需将堆大小缩小一个,但不是在尾部切断,而是在头部切断。因此,您必须为heapify提供一个偏移量参数,以便它知道堆元素实际从数组开始的位置。