如果快速排序算法中的第一个元素恰好是最小值,该怎么办

时间:2013-06-03 21:22:44

标签: algorithm math quicksort

我试着翻阅我可爱的教科书(无济于事)和在线。根据我正在Cormen工作的书,我们将使用数组中的第一个元素作为支点。我只是坚持要做什么,因为第一个元素恰好是1 该阵列如下:
[1,16,2,3,14,5,12,7,10,5,9,17,19,21,23,26,27]
同样,本书中算法的问题在于它选择第一个元素作为枢轴。并且一旦我们将1与所有其他元素进行比较并发现没有其他元素小于或等于那么我们将交换枢轴和子数组的中间元素,其中左边的子阵列小于枢轴并且右边的子阵列大于枢轴。但如果我们的支点是1,那么我们就无法交换。真的很困惑,任何帮助都会很棒。这本书的标题是“算法入门”第3版,以防有人熟悉它。

2 个答案:

答案 0 :(得分:7)

与正常情况没有区别:只需将左侧部分视为空,并在右侧部分进行快速排序,这是1的子阵列。

这不是特例。事实上,当输入被排序时,天真的快速排序退化为O(N^2)排序算法。引用Wikipedia

  

在quicksort的早期版本中,通常会选择分区最左边的元素作为pivot元素。不幸的是,这会导致已经排序的数组的最坏情况行为,这是一个相当常见的用例。通过选择枢轴的随机索引,选择分区的中间索引或(特别是对于较长的分区)选择分区的第一个,中间和最后一个元素的中位数(如建议的那样),可以轻松解决问题。 R. Sedgewick)。

答案 1 :(得分:2)

您可以使用已知为三的规则。选择数组中的第一个值,中间值和最后一个值,然后选择其中一个作为数据库候选项。这并不能保证你会得到最好的支点,但它会降低获得一个非常糟糕的支点的可能性。