当前位置: 首页 > 知识库问答 >
问题:

快速排序算法-澄清

闻人鸿飞
2023-03-14

我知道它是如何工作的,如果我不知道的话,网上有很多资料供我查阅。我在这里遇到的问题是,我找到的一些文章陈述如下(来自维基百科):

对数组重新排序,使所有值小于透视的元素都在透视之前,而所有值大于透视的元素都在透视之后(相等的值可以从任一方向移动)。分区后,枢轴处于其最终位置。这称为分区操作。

其他一些消息来源,(hackerrank视频):

第二种方法与枢轴本身无关,但它将确保所有比枢轴小的元素在比枢轴大的元素之前出现。甚至没有提到枢轴的终点。

所以如果这是要排序的数组[3,15,4,8,12]并且枢轴是8

解决方案1:[3,4,8,15,12]

我发现有这么多相互矛盾的意见,我想知道这是否重要,但我想知道是否有一个正确的方法来执行它,或者它可以是不同的。

共有1个答案

荀子轩
2023-03-14

两种主要的快速排序分区方案是Lomuto和Hoare。wiki文章中的pseudo code对这两种方法都进行了解释:

https://en.wikipedia.org/wiki/quicksort#lomuto_partition_scheme

https://en.wikipedia.org/wiki/quicksort#hoare_partition_scheme

对于Lomuto方案,枢轴要么位于子数组的左端,要么位于子数组的右端,有一个最后的交换来将枢轴放置到位。对于Lomuto,pivot元素不包括在递归调用中。

对于Hoare格式,由于算法的工作方式,枢轴最终就位。然而,枢轴最终作为左分区的最后一个元素或右分区的第一个元素结束。可以添加额外的代码来将pivot元素排除在递归之外,但最终会稍微慢一些。Hoare方案一般比Lomuto更快。

为了避免简单数据模式(如已排序数据、反向排序数据)的最坏情况下的O(n^2)时间复杂度,可以在开始时使用3的中位数,对子数组中的第一个、中间和最后一个元素进行排序,然后使用中间元素作为枢轴。另一种选择是选择一个随机数据透视,但是生成一个随机索引通常需要进行乘法、加法和除法(对于模),从而增加了开销。其他方案如中值的中值保证了O(n log(n))的时间复杂度,但常因子开销是标准方案的倍数。

https://en.wikipedia.org/wiki/median_of_medians

最坏情况下的堆栈复杂度可以限制在O(log(n)),方法是在分区步骤中只使用两个分区中较小的分区的递归,然后循环回去处理较大的分区。这并不能避免时间复杂度O(n^2)。

另一种选择是使用像introsort这样的混合排序,如果递归级别超过某个阈值,则切换到堆排序

 类似资料:
  • 主要内容:快速排序算法的实现提到排序算法,多数人最先想到的就是快速排序算法。快速排序算法是在分治算法基础上设计出来的一种排序算法,和其它排序算法相比,快速排序算法具有效率高、耗费资源少、容易实现等优点。 快速排序算法的实现思路是: 从待排序序列中任选一个元素(假设为 pivot)作为中间元素,将所有比 pivot 小的元素移动到它的左边,所有比 pivot 大的元素移动到它的右边; pivot 左右两边的子序列看作是两个待排

  • 快速排序,这是一个经典的算法,本文给出几种python的写法,供参考。 特别是python能用一句话实现快速排序。 思路说明 快速排序是C.R.A.Hoare于1962年提出的一种划分交换排序。它采用了一种分治的策略,通常称其为分治法(Divide-and-ConquerMethod)。 (1) 分治法的基本思想 分治法的基本思想是:将原问题分解为若干个规模更小但结构与原问题相似的子问题。递归地解

  • JavaScript算法-快速排序 快速排序是处理大数据集最快的排序算法之一。它是一种分而治之的算法,通过递归的方式将数据依次分解为包含较小元素和较大元素的不同子序列。该算法不断重复这个步骤直到所有数据都是有序的。 这个算法首先要在列表中选择一个元素作为基准值(pivot)。数据排序围绕基准值进行,将列表中小于基准值的元素移到数组的底部,将大于基准值的元素移到数组的顶部。 快速排序的算法和伪代码

  • 本文向大家介绍C#排序算法之快速排序解析,包括了C#排序算法之快速排序解析的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了C#实现快速排序的具体代码,供大家参考,具体内容如下 代码: 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教程。

  • 排序算法是在我们求职面试的时候有很大的概率会被提及,因为不管是在工程类方向中还是在研究类方向中,排序算法的思想都有广泛的应用。 下面,我就来大致的介绍一下各种面试中常见的排序算法的基本思想和相关的实现,希望对你有所帮助。 以下的排序思想都会基于这个序列来进行讲解,同时配上适当的图解和代码以及代码注释一起讲解。请放心食用。最后的序列都会按照从小到大的顺序进行排列,大家可以自己修改代码,使得序列按照从

  • 本文向大家介绍java实现快速排序算法,包括了java实现快速排序算法的使用技巧和注意事项,需要的朋友参考一下 1、算法概念。 快速排序(Quicksort)是对冒泡排序的一种改进。由C. A. R. Hoare在1962年提出。 2、算法思想。 通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序