快速排序最坏的情况

Joh*_*ohn 29 algorithm big-o quicksort

我正在研究下面所需的程序,以便更好地理解它.

Quicksort最糟糕的运行时间是什么?可能导致这种更糟糕的情况?我们如何修改quicksort程序来缓解这个问题?

我知道它有最坏的情况O(n^2),我知道它是在枢轴唯一的最小或最大元素时发生的.我的问题是如何修改程序以缓解此问题.

一个好的算法会很好.

Nik*_*chi 34

Quicksort的性能取决于您的枢轴选择算法.最天真的枢轴选择算法是选择第一个元素作为您的支点.如果您的数据已经排序(第一个元素将始终为最小值),很容易看出这会导致最坏的情况.

有两种常见的算法可以解决这个问题:随机选择一个支点,或选择三个中位数.随机是显而易见的,所以我不会详细介绍.三个中位数涉及选择三个元素(通常是第一个,中间和最后一个)并选择那些元素的中位数作为支点.

由于随机数生成器通常是伪随机的(因此是确定性的)并且三个算法的非随机中值是确定性的,因此可以构造导致最坏情况行为的数据,但是它在正常使用中很少出现.

您还需要考虑性能影响.随机数生成器的运行时间将影响快速排序的运行时间.中位数为3,您正在增加比较次数.


the*_*ick 10

最糟糕的表现条件:

当每次选择的枢轴都是"最大"或"最小"时,这种模式会重复出现

所以对于1 3 5 4 2

如果按1,2,3,4,5或5,4,3,2,1的顺序选择枢轴

那么最坏的情况是运行时间是O(n*n)

如何避免最坏的情况:

(1)将数组分为五组.如果1..100 则为(1..20)(21..40)(41..60)(61..80)(81..100)

(2)选择每组中前五个元素的中位数,如此(3)(23)(43)(63)(83)

(3)现在选择它们中间作为枢轴,所以这里(43)


Gab*_*art 5

一个简单的修改是随机选择枢轴.这样可以高概率地得到良好的结果.


Bur*_*rad 4

已经有一段时间了,但我认为快速排序最糟糕的情况是数据已经排序。快速检查数据是否已排序可以帮助缓解此问题。

  • @Nikita:在最简单、最基本的朴素快速排序中,枢轴是第一个元素。已排序数据是该版本(或反向排序数据)的最坏情况比较次数。 (7认同)