我正在研究下面需要的程序以更好地理解它。快速排序最差情况
Quicksort最糟糕的情况下运行时间是什么,什么可能会导致这种更糟的情况下性能?我们如何修改quicksort程序来缓解这个问题?
我知道它有最坏的情况O(n^2)
,我知道它发生时,枢轴唯一最小值或最大元素。我的问题是如何修改程序来缓解这个问题。
一个好的算法会很好。
我正在研究下面需要的程序以更好地理解它。快速排序最差情况
Quicksort最糟糕的情况下运行时间是什么,什么可能会导致这种更糟的情况下性能?我们如何修改quicksort程序来缓解这个问题?
我知道它有最坏的情况O(n^2)
,我知道它发生时,枢轴唯一最小值或最大元素。我的问题是如何修改程序来缓解这个问题。
一个好的算法会很好。
这已经有一段时间了,但我认为快速排序最糟糕的情况是数据已经排序。快速检查数据是否已经排序可以帮助缓解这个问题。
不,不是。对于已经排序的数据,它会工作得很好。 – 2010-10-25 23:28:47
@Nikita:在最简单的,最基本的幼稚快速排序中,枢轴是第一要素。已排序的数据是该版本(或反向排序数据)的最差情况比较数。 – 2010-10-26 00:23:21
一个简单的修改就是随机选择pivot。这给出了好的结果with high probability。
快速排序的性能取决于您的数据透视选择算法。最朴素的枢轴选择算法是只选择第一个元素作为枢轴。很容易看出,如果您的数据已经排序,则会导致最差情况下的行为(第一个元素始终为最小值)。
有两种常见的算法来解决这个问题:随机选择一个数据透视表,或者选择三位数的中位数。随机是显而易见的,所以我不会详谈。三个中间值包括选择三个元素(通常是第一个,中间和最后一个)并选择这三个元素的中值作为关键点。由于随机数发生器通常是伪随机的(因此是确定性的)并且三种算法的非随机中值是确定性的,所以可以构造导致最坏情况行为的数据,但是它很少出现正常使用。
您还需要考虑性能影响。随机数生成器的运行时间会影响快速排序的运行时间。中位数为三,你正在增加比较的数量。
最坏性能条件:
当选择每次枢轴是 '最大' 或 '最小' 和此模式重复
所以对于1 3 5 4 2
如果枢转按顺序选1,2,3,4,5或5,4,3,2,1
那么最坏的情况下运行时间是O(n * n)
如何避免最坏的情况下:
(1)除以阵列分为五个sets.So如果1..100集合是(1..20)(21..40)( 41..60)(61..80)(81 ..100)
(2)选择第一五行的中位数在每个设定成(3)(23)(43)(63)(83)
(3)现在选择之中的中值他们作为支点在这里它的(43)
最差的情况下运行时间取决于快速排序内的分区方法。这有两个方面:
良好的战略选择枢轴在以前的帖子已经被outlinied(中位数的中位数,或三个位或随机化)。但即使枢轴是明智的选择,在极端情况下,如果一个数组的所有相等的元素会导致最坏的情况下运行时,如果只有两个分区建成,因为一个将携带相等的元素,这是所有元素:
解决此问题的一种方法是分割成三个分区,低级(元件<枢轴),相等(元素=枢轴)和上分区。 “=枢轴元素”处于最终位置。如果不是空的话,下部分区和上部分区仍然需要排序。
与随机总之,中位数或某种组合的中间选择一个支点最坏的情况是相当罕见的,但不是不可能,这让与上限O(N²)的最坏情况下的算法。
此外,你应该注意重复的元素。例如,如果所有元素在被排序的数组中都是相等的,那么根据quicksort,它可能会导致最坏情况的行为。 – 2010-10-26 00:36:16
正在做作业吗?如果是的话,没问题,但你可能想这样做。 – 2010-10-26 10:43:12