我是问这个问题在接受采访。他们都是O(nlogn),但大多数人使用的快速排序,而不是成了归并排序。为什么?

有帮助吗?

解决方案

快速排序已O(n2)最糟糕的情况下运行时间和O(n日志n)的平均情况下,运行时间。然而,它优于合并排序在许多情况下,由于许多因素影响的一个算法的运行时,及时把它们放在一起,快速排序胜出。

特别是,常常引述的运行时间排序的算法是指数的比较数或全部门办法有必要进行排序的数据。这确实是一个很好的衡量业绩,特别是因为它是独立的基本硬件设计的。然而,其他的事情--诸如局部性的基准(即我们读了很多元素都可能缓?) –还发挥重要作用在当前的硬件。快速排序特别是需要点额外的空间,并显示出良好的缓的地方,这使得它更快,比合并排序在许多情况下。

此外,它很容易避免的快速排序的最糟糕的情况下运行的时间O(n2)几乎完全通过使用一个合适的选择的中枢--例如采摘,它在随机(这是一个优秀的战略)。

在实践中,许多现代化的实现方式的快速排序(特别般++'s std::sort)是实际上 introsort, ,他们的理论上的最糟糕的情况是O(n日志n),同样作为合并排序。它实现了这种限制的递归深度,并交换到不同的算法(heapsort)一旦这超过了日志n.

其他提示

如许多人已经指出的,平均情况下的性能快速排序的速度比成了归并排序。 这只是真的,如果你是假定固定的时间访问的任何片上的存储器的需求。

在RAM这个假设的一般是不是太糟糕(它是不总是正确的,因为缓存,但是它不是太糟糕).但是如果数据结构是足够大,以生活在磁盘上,然后快速排序得到 杀死了 事实上,你的平均盘不喜欢的东西200随机的要求。但是,同一磁盘上有任何麻烦的阅读或书写兆字节每秒的数据的顺序。这正是成了归并排序。

因此,如果数据已被排序的磁盘上,你真的,真的想要使用的一些变化在成了归并排序。(通常为你的快速排序子列表,然后开始将它们合并在一起上述一些大小阈值。)

此外,如果您需要做的 任何东西 数据集的大小,认真思考如何避免寻求磁盘。例如这就是为什么标准建议你降的索引之前做的大量数据加载到数据库中,然后重建索引后。维持索引期间负载意味着不断地寻求磁盘。相反如果你把索引,则该数据库可能重建该指数排序第一的信息来加以处理(采用成了归并排序的当然!) 然后载入a b树datastructure的索引。(BTREEs自然保存在了,所以你可以负载一个从一个排序的数据集,有几个旨在盘。)

已经有一些情况下,了解如何避免盘寻求让我做数据处理工作需要时间,而不是几天或几周。

实际上,快速排序是O(n2).它的 平均情况 运行时间是O(时间复杂(n)),但是它的 最糟糕的情况 是O(n2),这发生时当你在一个列表,其中包含几个独特的项目。随机采取O(n)。当然,这不会改变其最糟糕的是,它只是防止恶意用户使你的排序需要很长的时间。

快速排序是更受欢迎,因为它:

  1. 是在地方(成了归并排序需要额外的存线性元素数量被排序).
  2. 有一个小隐藏的定。

"然而,大多数人使用的快速排序,而不是成了归并排序。为什么?"

一个心理上的原因没有得到很简单,快速排序更巧妙的名字命名。即良好的营销。

是的,快速排序三partioning可能是一个好的一般目的排序的算法,但世界上没有得到过这样的事实,"快速"之类的声音更强大的比"合并"进行排序。

如其他人已经指出的,最糟糕的情况下快速排序是O(n^2),同时成了归并排序和heapsort住在O(nlogn).平均的情况,但是,所有三个是O(nlogn);所以他们绝大多数的情况相媲美。

是什么让快速排序更好的平均是,内部循环意味着比较数值与一个单一的,而在另两个两个术语是不同的,对每一比较。换句话说,快速排序不一半,因为许多内容如其他两个算法。在现代的Cpu性能严重占主导地位的访问时间,所以,在结束快速排序结束是一个伟大的第一选择。

我想添加的三个algoritms提到迄今为止(成了归并排序,快速排序和堆排序)仅成了归并排序是稳定的。就是说,以不改变这些价值观具有相同的密钥。在某些情况下,这是理想的。

但,说实话,在实际情况中大多数人只需要良好的平均绩效和快速排序。快=)

所有的排序的算法有自己的跌宕起伏。看看 维基百科文分类的算法 对于一个很好的概述。

维基百科上的条目的快速排序:

快速排序也与竞争 成了归并排序,另一种递归的排序 算法,但是有益的 最糟糕的情况下Θ(nlogn)运行时间。成了归并排序是一个稳定的排序,不同 快速排序和heapsort,并且可以 很容易地适应工作上的联系 列出和非常大的名单储存在 慢访问的媒体(如磁盘 存储或网络附加储存。虽然快速排序可以写到 操作上的联系名单,这往往会 遭受贫穷的枢没有选择 随机访问。主要的缺点 为成了归并排序,当工作 上阵列,它需要Θ(n)辅助 空间在最好的情况下,而 变的快速排序在地方 分区和尾使用递归 只Θ(的)空间。(注意的时候 操作上的联系名单,成了归并排序 只需要一个小的、定量 辅助储存。)

Mu! 快速排序不是更好,这是非常适合于不同种类的应用,比成了归并排序。

成了归并排序是值得考虑,如果速度是至关重要的,坏坏的情况下,性能是不能容忍的和额外的空间可用。1

你说,他们"他们都是O(nlogn)[...]".这是错误的。"快速排序采用有关n^2/2号比较,在最糟糕的情况。"1.

但是最重要的财产根据我的经验是易于实施的顺序访问可以使用,同时排序在使用编程语言的必要范例。

1 塞奇威克、算法

快速排序是最快的排序的算法在实践中,但有一定数量的病理情况,可以让它执行作为严重,因为O(n2)。

Heapsort是保证在运行O(n*ln(n))和只需要有限的额外储存。但是,有许多引用的真实世界的测试显示,heapsort大大慢于快速排序上的平均水平。

维基百科的解释是:

通常,快速排序明显加快在实践中比其他Θ(nlogn)的算法,因为其内在的循环可有效地实施在大多数的架构,而在大多数实际的数据能够使设计的选择,这最大限度地减少对概率的要求二次时间。

快速排序

成了归并排序

我认为还有问题存储量的需要成了归并排序(这是Ω(n)),快速排序实现所没有的。在最糟糕的是,它们是相同数额的算法时,但成了归并排序需要更多的储存。

快速排序并不优于成了归并排序。O(n^2)(最糟糕的情况下,很少发生),快速排序可能远远慢于O(nlogn)的合并排序。快速排序具有较小的开销,所以小n和缓慢的电脑,这是更好的。但是,计算机这么快,今天的额外开销成了归并排序是可以忽略不计,而该风险的一个非常缓慢的快速排序远远超过了微不足道的开销成了归并排序,在大多数情况下。

此外,成了归并排序的叶子项目相同的钥匙在他们原来的顺序,一种有用的属性。

我想添加到现有的伟大的回答某些数学有关如何快速排序执行时散,从最好的情况下,怎么可能那就是我希望,这将帮助人们了解一点更为什么O(n^2)情况下是不是真正的关切更复杂的实现快速排序.

外面的随机的准入问题,有两个主要因素,可以影响的性能快速排序,他们既关系到如何枢比较的数据,排序。

1)一个小型号的钥匙在数据。数据集的所有相同的价值将进行排序,在n^2时在香草2分区快速排序,因为所有的价值,除了枢轴位置都放在一边的每一个时间。现代化的实现方式解决这个问题的方法,如使用3个分区的排序。这些方法上执行一个数据集的所有相同的价值O(n)的时间。因此,使用这样的实现意味着一个输入与少数的钥匙实际上提高绩效的时间和不再是令人关切的问题。

2)极其恶劣的枢选择可能会导致最糟糕的情况下的性能。在一个理想的情况下,枢将永远是这样,50%的数据是较小和50%的数据更大,因此,该输入将被打破的一半在每一次迭代。这为我们提供了n次比较和全部门办法的时间的日志-2(n)递归于O(n*的)时间。

多少非理想枢的选择影响到执行时间?

让我们考虑这样一种情况,枢轴一直是这样选择的,75%的数据是一个侧面上的枢轴。它仍然是O(n*的),但现在基本日志已经改变到1/0.75或1.33.的关系时的性能改变基总是一个不断表示日志(2)/log(newBase).在这种情况下,常数是2.4.所以这个品质的枢选择需要2.4倍的理想。

如何快速这不会变得更糟?

不是很快,直至枢轴选择获取(持续)非常糟糕:

  • 50%在一个侧面:(理想的情况下)
  • 75%以上的一个侧面:2.4倍长
  • 90%以上的一个侧面:6.6倍长
  • 95%以上的一个侧面:13.5倍长
  • 99%以上的一个侧面:69次长

当我们接近100%,一个侧日志部分的执行办法n和整个执行渐进的办法O(n^2).

在一个天真的执行情况的快速排序,例如排列(1件枢轴)或一种反向排列(对于最后一项要件的枢轴)将可靠地产生的最坏情况O(n^2)的执行时间。此外,实现一个可预测的枢选择能够经受到DoS攻击数据,设计用于产生最糟糕的情况下执行的。现代化实现了避免这种通过各种方法,例如随机化的数据之前进行排序、选择的中间值3随机选择的指标,等等。这个随机的混合,我们有2个情况:

  • 小小的数据集。最糟糕的情况下是合理的可能的,但O(n^2)不是灾难性的,因为n足够小,n^2也小。
  • 大数据集。最糟糕的情况是可能在理论上而不在实践。

怎么可能是我们看到可怕的性能吗?

机会是 微乎其微.让我们考虑一种5000值:

我们假想的实现将会选择一个枢轴使用的中位数为3随机选择的索引。我们将考虑枢轴是25%-75%的范围是"好的"和枢轴是在0%-25%或75%-100%的范围是"坏"。如果你看一下概率分布用的中位数为3个随机的索引,每递归有一个11月16日的机会,结束了一个良好枢轴。让我们2个保守(并假)的假设,以简化的数学:

  1. 良好的支点是总是在一个25%/75%的分裂和工作在2.4*理想的情况。我们永远不会得到一个理想的分割或任何分比25/75的.

  2. 不好的支点是总是最糟糕的情况并作出贡献基本上没有什么解决方案。

我们的快速排序的执行将停止在n=10和关于插入一个排序,因此,我们需要22 25%/75%枢分区突破5 000名输入值下降,远。(10*1.333333^22>5000)或者,我们需要4990最糟糕的是枢轴。请记住,如果我们积累22良好的支点在 任何一点 然后排序将完成,因此最糟糕的情况下或任何东西靠近它要求 非常 坏运气。如果我们花了88递归于实际上实现的22个好的支点要求排序下,n=10,那将是4*2.4*理想的情况下,或大约10倍的执行时间最理想的情况。怎么可能是我们会 实现所需要的22好转后88递归?

二概率分布 可以回答这个问题,答案是约有10^至18.(n为88,k21,p0.6875)用户是关于一千倍更有可能被闪电击中1第二,它需要点击[种]比他们看到那5000个项目的排序运行 更糟糕 于10*理想的情况。这个机会变得更小的数据集得到更大。这里有一些阵列大小以及其相应的机会以运行超过10*理想的:

  • 列640项目:10^-13(需要15个良好枢纽点的60试图)
  • 阵列的5 000名项目:10^-18(需要22个良好枢轴出的88试图)
  • 阵列的40 000名项目:10^-23(要求29好转出的116)

记得这2个保守的假设是比现实。所以实际性能更好的是,和平衡的剩余的概率更接近理想不是。

最后,正如其他人已经提到,即使这些荒谬不太可能的情况下,可以消除通过转换到一堆排序,如果递归堆去太深。所以TLDR是,对于良好的实现快速排序,最糟糕的是 不真的存在 因为它已经设计出来,并完全执行在O(n*的)时间。

答案会略微倾斜的对快速排序w。r.t变化带来的DualPivotQuickSort为原始价值观。这是用在 JAVA7 排序在 java。工具.阵列

It is proved that for the Dual-Pivot Quicksort the average number of
comparisons is 2*n*ln(n), the average number of swaps is 0.8*n*ln(n),
whereas classical Quicksort algorithm has 2*n*ln(n) and 1*n*ln(n)
respectively. Full mathematical proof see in attached proof.txt
and proof_add.txt files. Theoretical results are also confirmed
by experimental counting of the operations.

你可以找到JAVA7implmentation在这里 http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/7-b147/java/util/Arrays.java

还真棒读DualPivotQuickSort- http://permalink.gmane.org/gmane.comp.java.openjdk.core-libs.devel/2628

在合并排序,一般的算法是:

  1. 排序的左子列
  2. 排序的权利分列
  3. 合并的2排序子阵

在顶层,合并第2排序子阵涉及到处理与N的要素。

下面一级,每次迭代的步骤3涉及到处理N/2的元素,但是你要重复这一过程的两倍。所以你仍然在处理的2*N/2==N要素。

一等级下面,你们合并4*N/4==N元,等等。每一个深入的递归堆涉及合并相同数量的元素,在所有呼吁,深度。

考虑快速的排序的算法来代替:

  1. 挑选一个支点
  2. 地方的枢点在正确的位置在该阵列,所有小的要素,较大的元素的权利
  3. 排序的左子阵列
  4. 排序的权利-子阵列

在顶层上,你正在处理的一系列大小N.你再挑一个枢点,把它放在正确的位置,然后可以忽略它完全用于剩下的算法。

一等级下面,你可以处理2子阵列具有合并的大小N-1(即,减去早先的枢点)。你挑一个支点的每个子阵列,其设立2个额外的枢点。

一等级下面,你可以处理4子阵与联合尺寸N-3,出于同样的原因,如上。

然后N-7...然后N-15...然后N-32...

深入你的递归堆仍然大致相同(的).与合并排序的,你总是在处理一个N-元的合并,在每个级别的递归堆。快速排序虽然数的元素,你正在处理减少因为你下去。例如,如果你看一下深入的中通过递归堆数的元素,你正在处理的是N-2^((的)/2))==N-sqrt(N)。

免责声明:在合并排序,因为你把列入2完全相等组块,每次递归的深度是完全的.在快速进行排序,因为你的枢点是不大可能正好在中间的阵列,深入你的递归堆可能稍大于的.我还没有做数学看到多大的作用,这个因素和因素上所述,实际上发挥中的算法的复杂性。

与不同的合并排序快速进行排序不使用辅助空间。而合并排序使用的一个辅助空间O(n)。但合并排序具有最糟糕的是时间复杂性O(nlogn),而最糟糕的情况复杂性的快速排序是O(n^2)这种情况发生时该阵列的是已经被排序。

同时他们都在相同的复杂程度类,这并不意味着他们都有相同的运行时间。快速排序通常快于成了归并排序,只是因为它更容易代码紧实施和操作它可以走得更快。这是因为,快速排序通常是更快,人们使用它,而不是成了归并排序。

但是!我个人常常会使用成了归并排序或快速排序变,降低成了归并排序时快速排序并不好。记住。快速排序只是O(n记录n)在 平均.这是最糟糕的情况是O(n^2)!成了归并排序总是O(n记录n)。在情况下的实时性或反应能力是一个必须和你的输入数据的可能来自一个恶意的来源, 你不应该使用纯的快速排序.

快速排序具有更好的平均情况的复杂性,但在某些应用中是错误的选择。快速排序是容易受到拒绝服务攻击。如果攻击者可以选择输入来进行排序,他可以很容易地建设,需要最糟糕的是时间复杂性o(n^2).

成了归并排序的平均情况的复杂性和最糟糕情况的复杂性是相同的,因此不遭受同样的问题。这种财产的合并排序也使得它的最佳选择,用于实时系统-正是因为没有病态的情况下,导致其运行得多,速度较慢。

我是个大风扇成了归并排序比我的快速排序,对于这些原因。

为什么快速排序是很好吗?

  • 快速排序需要正^2在最坏的情况下和NlogN平均情况。最糟糕的情况下发生的,当数据被排序。这可以缓解由随机的随机前排序开始。
  • 快速排序并不需要额外存储器,是采取通过合并排序。
  • 如果数据集大的并且有相同的项目、复杂程度的快速排序减少了通过使用3种方式的分区。更多的没有相同的物品更好地进行排序。如果所有项目都是相同的,这种在线性时间。[这是默认的执行情况在大多数图书馆]

是的快速排序总是比成了归并排序?

不是真的。

  • 成了归并排序是稳定的,但是快速排序是没有的。所以如果你需要稳定的输出,将使用成了归并排序。稳定性是需要在许多实际应用。
  • 记忆是廉价的现在。因此,如果额外存储器中使用按成了归并排序不是至关重要的应用程序,没有害处在采用成了归并排序。

注: 在爪哇阵列。sort()功能使用的快速排序为原始数据的类型以及成了归并排序的对象的数据类型。因为对象的消耗存储器开销,所以添加一个小小的开销成了归并排序可能不会有任何问题对于业绩的观点。

参考:看着的快速排序的视频 3周,普林斯顿算法课程,在课程

快速排序是最糟糕的是O(n^2),但是,平均情况一直出执行合并排序。每个算法O(nlogn),但是你要记住,在谈论大O我们离开的复杂程度低的因素。快速排序具有明显的改进,在合并排序的时候到恒定的因素。

合并排序也需要O(2n)存储器,虽然快速进行排序,可以在地方(仅需要O(n))。这是另一个原因是快速的排序通常是优选的过合并排序。

额外信息:

最糟糕的情况下的迅速排序发生时的枢轴是不好的选择。考虑下面的例子:

[5, 4, 3, 2, 1]

如果对枢轴被选为最小的或最大数目的小组然后快速进行排序,将运行在O(n^2).该概率的选择元,是最大的或最小的25%的名单是0.5。让算法0.5机会被一个好的支点。如果我们采用一个典型的枢选择算法(说随机选择一个元素),我们有0.5机会选择一个良好枢轴用于每一个选择的一个枢轴。对于藏品的一个大大小的概率总是选择一个贫穷的枢轴是0.5*n.根据这种概率快速排序是有效率的平均值(和典型的)的情况。

这是一个很老的问题,但因为我已经处理了两个最近这里是我2c:

合并排序的需求平均-N记录N比较。对于已经(几乎)排序排列阵该得到1/2N记录N,由于合并时我们(几乎)始终选择"左边"的一部分,1/2的N次和随后复制权利的1/2N要素。此外,我可以推测,已经排入使得处理器的分支预测的光芒但是猜测,几乎所有分支机构正确,从而防止管道的摊位。

快速排序上平均需要~1.38N记录N比较。它不能极大地受益于已排列在条款的比较(但是它不会在全部门办法和可能在条款中的分支的预测内部CPU)。

我的基准相当现代的处理表示如下:

当比较的功能是一回呼功能(如在时,qsort()libc执行情况)的快速排序低于成了归并排序15%,在随机的输入和30%的已排列64位整数。

另一方面,如果比较是不回电我的经验是,快速排序优于成了归并排序由多达到25%。

但是如果你的(大)列有非常少数的独特价值,合并排序开始获得通过快速排序,在任何情况下。

所以也许底线是:如果比较昂贵的(例如回呼功能,比较串,比较的许多部分的结构大多是获得第二-三-等"如果",使差值)的机会是,你将能更好地与合并排序。为简单的任务的快速排序将会更快。

这说所有以前所说的是真的:-快速排序可N^2,但塞奇威克声称,一个良好的随机实施有更多的机会,计算机进行排序被击中了闪电去N^2 -成了归并排序需要额外的空间

当我尝试了这两个排序的算法,通过统计数字递归的话, 快速排序一直有小recursive calls比成了归并排序。这是因为快速排序具有枢轴和轴不包括在下次递归的呼吁。这种方式的快速排序,可以达到递归的基本情况下更快成了归并排序。

所有的事情都是平等的,我想大多数人使用不管是大多数提供方便,而这往往要时,qsort(3).比其他快速排序被称为是非常快速上阵列,就像成了归并排序的共同选择的名单。

什么我不知道是为什么它很难得一见 基数 或桶的排序。他们O(n)至少在联名单和它所需要的是一些方法的变换的关键一个序号。(strings和漂浮的工作就好了。)

我认为原因有与如何计算机科学教授。我甚至不得不证明给我讲师中的算法分析,这是确实有可能排序的速度比O(n日志(n))。(他已经证明,你不能 比较 排序的速度比O(n日志(n)),这是正确的。)

在其他新闻,漂浮,可以按整数,但你必须把负数周之后。

编辑:实际上,这是一个甚至更为恶毒的方式进行排序浮作为整数: http://www.stereopsis.com/radix.html.注意点-翻转的窍门可以使用无论是什么排序的算法,你实际上是使用...

这是很难说。最糟糕的成了归并排序是n(log2n)-n+1,这是准确的,如果n等于2^k(我已经证明这)。和任何n,它们之间(n lg n-n+1)和(n lg n+n+O(lg n))。但对于快速排序,其最好是nlog2n(也n等于2^k)。如果你成了归并排序划分,通过快速排序,它相当于一个当n是无限的。所以这是因为,如果最糟糕的情况成了归并排序优于最好的情况下的快速排序,为什么我们使用的快速排序?但是记住,成了归并排序是不在的地方,它要求2n memeroy空间。并且成了归并排序还需要做许多阵列的副本,其中我们不包括在分析算法。一句话,成了归并排序是真的faseter于快速排序在理论,但在现实中你需要考虑的存储空间、成本列的副本,合并是慢于快速进行排序。我一旦做出一项实验在哪里给了我1000000数字在java,通过随机的类,和它采取了2610ms由成了归并排序,1370ms通过快速排序.

小的增加快速vs合并排序。

此外,它可以依赖于一种排序的项目。如果接到的项目、交换和比较是不简单的操作,例如比较整数在飞机的记忆,然后合并排序可能最好的算法。

例如,我们的项目进行排序使用网络的协议对远程服务器。

此外,在集装箱定义,如"联名单",这是没有益处的快速进行排序。
1.合并排序上链接清单,不需要额外的存储器。2.访问的元素,在快速进行排序不是顺序(在存储器)

快速排序是一个地方排序的算法,使其更好地适合阵列。合并排序,另一方面需要额外的储存的O(N),并且更适合联系名单。

不像阵列,喜欢表我们可以插入项目中有O(1)空间和O(1)时间,因此合并操作中的合并排序的可实施没有任何额外的空间。然而,分配和分配额外的空间数组具有不利影响的运行时的合并排序。合并排序也有利于联的列表数据是按顺序访问的,不如随机存储器访问。

快速排序,另一方面需要大量的随机存储器访问,并与一系列我们可以直接接入存储,没有任何穿越需要由联的名单。也快速排序时使用的数组有一个很好的地区的参考因数组存储连续在存储器。

虽然两个排序的算法的平均复杂性是O(NlogN),通常人们对于普通的任务使用一系列用于储存,并为此快速排序应该算法的选择。

编辑:我刚刚发现,合并排序最糟糕/最佳/平均情况下总是nlogn,但快速的排序可能有所不同,从n2(最糟糕的情况时的因素已经排序),以nlogn(avg/最好的情况下,当枢始终将列在两个半).

考虑时间和空间上的复杂性两者。对于合并排序:时间的复杂性:O(nlogn), 空间复杂性:O(nlogn)

快速排序:时间的复杂性:O(n^2), 空间复杂性:O(n)

现在,他们都赢得一个清白的每一个。但是,使用随机枢你几乎总是可以减少时间的复杂的快速排序O(nlogn).

因此,快速进行排序是优选的,在许多应用程序,而不是合并排序。

在c/c++的土地,在不使用限制集装箱,我倾向于使用快速排序,因为它是建立 进入运行时间,而成了归并排序是没有的。

因此,我认为,在许多情况下,它只是路径的少阻力。

除了性能,可以高得多快进行排序,对于情况的整个数据集不适合工作组。

其中一个原因是更多的哲学。快速排序是顶级的->下的哲学。与n的要素排序,有n!可能性。有2个分区的m&n-m其是互相排斥的,可能性的数量在几个数量级。m!*(n-m)!是较小的几个数比n!独自一人。想象一下5!vs3!*2!.5!有10倍以上的可能性超过2分2和3的每一个。并推断到1万因vs900K!*100K!与所以不用担心建立的任何顺序范围内或一个分区,只是建立了在更广的层面在分区和减少的现象:在一个分区。任何以较早成立的范围内将受到干扰后如果分区本身并不是相互排斥的。

任何自下而上了法等合并进行排序或堆类似的一个工人或雇员的做法在一开始,比在微观一级的早期。但是,这便注定是失去了尽快中的一个要素,它们之间找到以后。这些办法是非常稳定和可预测的但不一定数量的额外工作。

快速排序等管理的方法,一个不是最初关注的任何顺序,只有约会议的一个广泛的标准没有考虑顺序。然后分区缩小,直到你得到一个有序的设置。真正的挑战在快速排序是在寻找一个分区或标准,在黑暗的时候你什么都不知道有关因素进行排序。这就是为什么我们需要花费一些努力,以找到一个中间值,或者选择1随意或任意"管理"方法。找到一个完美的中位值可以采取大量的努力,并导致一个愚蠢的下而上的方法。所以快速排序说只是一个随机挑选一个枢轴,并希望它将在中间的某个地方或者做一些工作,以找到中间值3、5或更多的东西找到一个更好的中间值但不要计划是完美的,不要浪费任何时间,在最初的订货。似乎做得好,如果你是幸运还有时会降低,n^2时你没有得到一位数,但只是采取一个机会。任何方式的数据是随机的。正确的。所以我同意顶>下来合乎逻辑的方法的快速排序&事实证明,机会的大约需要枢选择和比较,它节省了前似乎更好的工作更多的时间比任何一丝不苟&彻底稳定下>上的方法如合并排序。但

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top