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

一个关于快速排序的基本困惑

沃阳飙
2023-03-14

假设在快速排序的情况下,我们选择一个轴作为数组的第一个元素。现在,最佳/最坏情况的复杂性是O(n^2),而在平均情况下,它是O(nlogn)。是不是很奇怪(最好的情况复杂度大于最坏的情况复杂度)?

共有2个答案

龚威
2023-03-14

快速排序0(nlogns)的最佳情况是,所选的pivot在每次迭代中将子数组分成两个大小相等的部分。

快速排序的最坏情况是,选定的轴是子数组中的最小元素,因此将数组分成两部分,其中一部分由一个元素(轴)和子数组中所有其他元素的另一部分组成。

因此,在已经排序的数组中选择第一个元素作为轴心,将得到0(n^2);)

因此,选择一个好的支点很重要。例如,使用子阵列的第一个、中间和最后一个元素的中值作为轴。

端木兴国
2023-03-14

与平均情况一样,最佳情况复杂度为O(nlogn)。最坏的情况是O(n^2)。检查http://en.wikipedia.org/wiki/Quick_sort.

虽然其他算法如合并排序和堆排序具有更好的最坏情况复杂度(O(nlogn)),但通常快速排序速度更快-这就是为什么它是最常用的排序算法。关于这一点,可以在“为什么快速排序比合并排序好”中找到一个有趣的答案?。

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

  • 本文向大家介绍基于javascript实现的快速排序,包括了基于javascript实现的快速排序的使用技巧和注意事项,需要的朋友参考一下     "妙味课堂"的一期视频教学。 主要原理是:快速排序的原理:找基准点、建立二个数组分别存储、递归 基准点:就是找到这个数组中间的一个数; 建立二个数组分别存储:就是以这个基准点,将它的左右数值,分别存放到两个定义的新数组当中; 递归:在函数内部调用自身;

  • 快速排序是由东尼·霍尔所发展的一种排序算法。在平均状况下,排序 n 个项目要 Ο(nlogn) 次比较。在最坏状况下则需要 Ο(n2) 次比较,但这种状况并不常见。事实上,快速排序通常明显比其他 Ο(nlogn) 算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来。 快速排序使用分治法(Divide and conquer)策略来把一个串行(list)分为两

  • 1. 前言 本节内容是排序算法系列之一:快速排序,主要讲解了快速排序的主体思路,选取了一个待排序的数字列表对快速排序算法进行了演示,给出了快速排序算法的 Java 代码实现,帮助大家可以更好地理解快速排序算法。 2. 什么是快速排序? 快速排序(Quick Sort),是计算机科学与技术领域中非常经典的一种排序算法,应用分治思想进行排序。 快速排序由于其时间复杂度优于大部分的排序算法,因而命名为快

  • 在很多地方,我都看到过使用堆栈实现快速排序比使用递归更快的说法。这是真的吗?我知道编译器通常擅长将递归转换为迭代,但页面上的评论称,递归太复杂,无法优化。 快速排序还有哪些其他优化? 以下是我提到的一些地方,即递归实现优于递归实现:http://www.geeksforgeeks.org/iterative-quick-sort/ 尽管有上述优化,该函数仍然是递归的,并使用函数调用堆栈来存储l和h

  • 问题:Mergesort将一个数字列表分成两半,并对这两个数字进行递归调用。相反,您能在左半部分执行quicksort,在右半部分执行mergesort吗?如果是,则通过显示每个步骤来显示它将如何对下面的数字列表进行排序。如果没有,请解释为什么不能。 Iam应该使用MergeSort对数字列表进行排序。左半部分将使用快速排序进行排序? 我想出来了。安:是的,我们可以 使用mergeSort对数组的