【问题标题】:Why Heap sort is not considered as a stable sorting algorithm为什么堆排序不被认为是一种稳定的排序算法
【发布时间】:2015-08-04 09:14:11
【问题描述】:

在 Java 中,堆排序似乎是最好的排序算法,同时根据 http://www.sorting-algorithms.com/ 对随机数数组进行排序 但是我仍然读到堆排序不稳定,为什么会这样?在对数组或随机数进行排序时,应将哪种排序算法视为最佳算法?

【问题讨论】:

  • 你知道排序算法中的“稳定”是什么意思吗?
  • 我不明白你是如何得出堆排序是最好的结论的。众所周知,它的性能不如 QuickSort,因为它对缓存不友好(排序时它会跳过整个数组)。 BTW QuickSort 是另一种不稳定的排序算法,这就是为什么它只用于对Java中的原始数组进行排序。
  • 我们不能说任何算法都适合所有目的。这取决于操作。
  • 没有“最佳”之类的东西。对于不同的场景,有更好和更差的。例如,快速排序通常比大多数都好,但是当我需要对磁盘上的数据进行排序时,我不想使用它。还有非比较类型,它们的速度可能非常快,但它们的适用性有限。
  • 所以你的问题的神秘意义是'“稳定”在排序中意味着什么',最好的答案是查找它。

标签: java arrays algorithm sorting data-structures


【解决方案1】:

稳定排序:不会改变相同/相等元素的相对位置的排序。

例如,
I/P: 2, 4, 3(a), 5, 1, 3(b)
O/P: 1, 2, 3(a), 3(b), 4, 5

在 I/P 中,3(b) 在 3(a) 之后,并且在 O/P 中保持不变。

这很容易解释。让我们举个例子:

3,3,2,1

认为前 3 是 3(a),第二个 3 是 3(b)。

3(a),3(b),2,1

堆排序首先从最大堆中提取最大数,即第一个元素,然后将其放在最后一个位置。

3(b),2,1,3(a)

然后size减1并应用heapify操作。因此新的size为3,前三个元素已经满足heap属性。

现在是表明堆排序不稳定的步骤

我们再次从堆中提取第一个元素的最大值并将其放在最后一个位置。

但是因为大小现在是 3,所以最后一个位置在 3(a) 的左边,因此我们得到:

2,1,3(b),3(a)

我们可以看到,元素 3(a) 和 3(b) 的顺序与原始顺序相反,堆排序的剩余部分只会对前两个元素进行排序,因此,要素 3(a) 和 3(b) 将保持原样。这就是堆排序不稳定的原因。

最终结果是

1,2,3(b),3(a)

【讨论】:

  • 我不认为这是正确的。如果您没有就地排序,则不会出现此问题。我认为当您将 3b 放在堆顶部并且它不会向下交换时,问题就出现了,因为它等于 3a。
  • @TheCodeNovice Fyi heapsort 确实是就地排序。
【解决方案2】:

因为它不能保证当它在正在排序的集合中遇到 2 个相等的元素时,它们的位置将被保留。 假设这个集合:3 2 2 1。当该算法遇到 2 并将其与 2 进行比较时,它可能会反转它们。 Sorting algorithms stability。 顺便说一句,如果您不关心收藏中相同项目的顺序,那么您可以选择最快的。

【讨论】:

    【解决方案3】:

    您应该阅读this

    堆排序使用二进制堆,使用的数据结构和算法使堆排序不稳定。

    【讨论】:

      猜你喜欢
      • 2011-08-22
      • 2013-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-03
      • 2021-10-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多