Quicksort - 使其稳定的条件

时间:2011-04-27 12:29:35

标签: sorting quicksort

如果排序算法使用等于键保留任意两个元素的相对顺序,则排序算法是稳定的。在哪些条件下快速稳定?

Quicksort在没有项目传递时是稳定的,除非它有一个较小的键。

还有哪些其他条件使其稳定?

3 个答案:

答案 0 :(得分:11)

嗯,使用O(N)空间而不是就地不稳定实现使用的O(log N)来制作稳定的快速排序非常容易。当然,使用O(N)空间的快速排序不一定要稳定,但可以这样做。

我已经读过可以制作一个使用O(log N)内存的就地快速排序,但它最终会慢得多(并且实现的细节有点野蛮)。

当然,您可以随时查看正在排序的数组,并添加一个额外的键,它是原始数组中的位置。然后快速排序将是稳定的,你只需要在最后删除额外的密钥。

答案 1 :(得分:0)

您可以将这些添加到列表中,如果这是您的方法:

  • 当元素具有绝对排序时
  • 当实现需要O(N)时间来记录相对顺序并在排序后恢复它们
  • 确保选择的枢轴是唯一的密钥,或当前子列表中的第一个密钥。

答案 2 :(得分:0)

条件很容易弄清楚,只需将原始顺序保持相等即可。没有其他条件与此条件有本质区别。关键是如何实现。

有一个很好的例子。

1。使用中间元素作为枢轴。

2。创建两个列表,一个列表较小,另一个列表较大。

3。从第一个迭代到最后一个,然后将元素放入两个列表中。将小于或等于和大于透视点的元素追加到较小的列表中,将大于或等于和小于透视点的元素追加到以下列表中较大的列表。继续递归较小的列表和较大的列表。

https://www.geeksforgeeks.org/stable-quicksort/

后两点都是必要的。中间元素作为枢轴是可选的。如果选择最后一个元素作为枢轴,只需从一开始就将所有相等的元素逐个追加到较小的列表中,它们将保持原始顺序不变。