Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 快速排序最坏情况_Algorithm_Big O_Quicksort - Fatal编程技术网

Algorithm 快速排序最坏情况

Algorithm 快速排序最坏情况,algorithm,big-o,quicksort,Algorithm,Big O,Quicksort,为了更好地理解它,我正在做下面需要的程序 快速排序最坏的运行时间是多少?什么可能导致这种最坏的性能?我们如何修改快速排序程序来缓解此问题 我知道它有最坏的情况O(n^2),我知道它发生在枢轴唯一的最小或最大元素时。我的问题是如何修改程序以缓解此问题 一个好的算法会很好。已经有一段时间了,但我认为快速排序最糟糕的情况是数据已经排序。快速检查数据是否已排序有助于缓解此问题。一个简单的修改是随机选择轴。这会产生很好的结果。快速排序的性能取决于轴心选择算法。最简单的枢轴选择算法是只选择第一个元素作为枢轴

为了更好地理解它,我正在做下面需要的程序

快速排序最坏的运行时间是多少?什么可能导致这种最坏的性能?我们如何修改快速排序程序来缓解此问题

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


一个好的算法会很好。

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

一个简单的修改是随机选择轴。这会产生很好的结果。

快速排序的性能取决于轴心选择算法。最简单的枢轴选择算法是只选择第一个元素作为枢轴。很容易看出,如果您的数据已经排序(第一个元素始终是min),那么这将导致最坏的情况

有两种常见的算法可以解决这个问题:随机选择一个轴,或者选择三个轴的中间值。随机性是很明显的,所以我不会详细说明。中位数三包括选择三个元素(通常是第一个、中间和最后一个),并选择这些元素的中位数作为轴心

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

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

最差性能条件:

当选择的每个时间轴都是“最大”或“最小”且此模式重复时

那么对于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) 选择集合so(3)(23)(43)(63)(83)中前五个元素的中位数


(3) 现在选择其中的中位数作为轴心,因此这里的(43)

最坏情况下的运行时间取决于快速排序中的分区方法。这有两个方面:

  • 选择轴
  • 如何围绕轴心进行分区
在以前的文章中已经概述了选择轴心点的好策略(中位数、三中位数或随机化)。但是,即使明智地选择了pivot,在极端情况下,如果一个数组具有所有相等的元素,那么如果只构建了两个分区,它将导致最坏的运行时情况,因为其中一个分区将承载相等的元素,即所有元素:

  • 这会导致分区被调用n次,每次调用平均取n/2,导致O(n²)
  • 这是不好的,因为这不是理论上最坏的情况,而是非常常见的情况
  • 请注意,检测空分区并不能解决此问题,因为枢轴可能具有最高或最低的元素值(例如,中位数为5,这也是最高的元素值,但仍可能存在一些错位的<5值)
解决这个问题的一种方法是划分为三个分区,一个较低的分区(elements
与随机化一起,选择最坏情况下的支点的中位数或某些组合非常罕见,但并非不可能,这使得算法的最坏情况上限为O(n²)

我想知道的问题经常被问到。AFAI的研究有两个关键问题

  • 如果数组已经排序,无论是升序还是降序,除了选择pivot作为列表的最小(最小)或最大(最大)元素之外。[2,3,4]或[4,3,2]
  • 如果所有元素都相同。[2,2,2]

不,不是真的。对于已经排序的数据,它可以很好地工作。@Nikita:在最简单、最基本的朴素快速排序中,pivot是第一个元素。“已排序数据”是该版本(或反向排序数据)比较的最坏情况数。最坏情况是已排序数组,但我认为即使您检查它是否已排序,也会有一些“几乎已排序”数组,它们将是“几乎最坏情况”。此外,您应该注意重复的元素。例如,如果要排序的数组中的所有元素都相等,则可能会导致最坏情况,具体取决于快速排序。这是作业吗?如果是,也没问题,但您可能希望这样标记它。