我正在研究以下需要的程序,以便更好地理解它。
Quicksort最糟糕的运行时间是什么?可能导致这种情况更糟的情况?我们如何修改快速排序程序以缓解此问题?
我知道它有最坏的情况O(n^2)
,我知道它在枢轴唯一的最小或最大元素时发生。我的问题是如何修改程序以缓解此问题。
一个好的算法会很好。
答案 0 :(得分:34)
Quicksort的性能取决于您的枢轴选择算法。最天真的枢轴选择算法是选择第一个元素作为您的支点。如果您的数据已经排序(第一个元素将始终为最小值),很容易看出这会导致最坏的情况。
有两种常见的算法可以解决这个问题:随机选择一个支点,或选择三个中位数。随机是显而易见的,所以我不会详细介绍。三个中位数涉及选择三个元素(通常是第一个,中间和最后一个)并选择那些元素的中位数。
由于随机数生成器通常是伪随机的(因此是确定性的),并且三个算法的非随机中位数是确定性的,因此可以构造导致最坏情况行为的数据,但是它很少能够在正常情况下出现的使用。
您还需要考虑性能影响。随机数生成器的运行时间将影响快速排序的运行时间。中位数为3,您将增加比较次数。
答案 1 :(得分: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)
答案 2 :(得分:5)
一个简单的修改是随机选择枢轴。这样可以获得良好的结果with high probability。
答案 3 :(得分:4)
已经有一段时间了,但我认为quicksort的最坏情况是数据已经排序。快速检查数据是否已经排序可以帮助缓解这个问题。
答案 4 :(得分:2)
最坏的情况是运行时间取决于快速排序中的分区方法。这有两个方面:
选择枢轴的良好策略在以前的帖子中已经超过了(中位数的中位数,或三个中位数或随机化)。但即使明智地选择了枢轴,在极端情况下,如果一个数组具有所有相同的元素,如果只构建了两个分区,它将导致最坏的情况运行时,因为一个将携带相等的元素,即所有元素:
解决这个问题的方法是分成三个分区,一个是低层(元素< pivot),一个是(elements = pivot)和一个是上层分区。 “=枢轴元素”处于最终位置。如果不是空的话,下部和上部分区仍然需要排序。
与随机化,中位数的中位数或某些组合选择一个支点最坏的情况是非常罕见但并非不可能,这使算法的最坏情况上限为O(n²)。
答案 5 :(得分:0)
我想知道的问题经常被问到。 AFAI研究有两个关键因素。
- 如果数组已经排序,则除了升序还是降序之外,还选择枢轴作为列表的最小(最小)或最大(最大)元素。 [2,3,4]或[4,3,2]
- 如果所有元素都相同。 [2,2,2]