我正在开发一个程序,需要更好地理解以下内容。
Quicksort的最坏运行时间是多少,可能会导致这种最坏情况的性能?我们如何修改quicksort程序以缓解这个问题?
我知道它的最坏情况是O(n^2)
,并且我知道当主元是唯一的最小或最大元素时会发生。我的问题是如何修改程序以缓解这个问题。
一个好的算法将是很好的选择。
我正在开发一个程序,需要更好地理解以下内容。
Quicksort的最坏运行时间是多少,可能会导致这种最坏情况的性能?我们如何修改quicksort程序以缓解这个问题?
我知道它的最坏情况是O(n^2)
,并且我知道当主元是唯一的最小或最大元素时会发生。我的问题是如何修改程序以缓解这个问题。
一个好的算法将是很好的选择。
快速排序的性能取决于你使用的枢轴选择算法。最简单的枢轴选择算法是选择第一个元素作为枢轴。很容易看出,如果数据已经排序,这将导致最坏情况的行为(第一个元素始终是最小值)。
有两种常见的算法来解决这个问题:随机选择枢轴或选择中位数。随机算法很明显,我就不详细介绍了。中位数算法涉及选择三个元素(通常是第一个、中间和最后一个),并选择其中位数作为枢轴。
由于随机数生成器通常是伪随机的(因此是确定性的),而非随机的中位数算法也是确定性的,因此可能会构造出导致最坏情况行为的数据,但在正常使用中很少发生。
你还需要考虑性能影响。你的随机数生成器运行时间会影响快速排序的运行时间。使用中位数算法会增加比较次数。
最差性能条件:
当每次选择的中心点是“最大值”或“最小值”,并且这个模式重复时。
例如对于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,3,4] 或 [4,3,2]
- 如果所有元素都相同。[2,2,2]