在快速排序的pivot_value复杂度的某些值是对数时会发生吗?
答案 0 :(得分:4)
没有
使用比较操作进行排序(并且快速排序就是这样一种算法)被证明是Omega(nlogn)
操作 - 因此它不能比O(nlogn)
做得更好,而且绝对不能在O(logn)
< / p>
使用比较排序为Omega(nlogn)
,因为您需要使用具有2/3可能结果的运算符来操作数据。既然有n!数据的排列,意味着您需要Omega(log(n!))
比较操作,而log(n!)严格受nlog(n)
限制 - 因此排序为Omega(nlog(n))
请注意,快速排序可以在Theta(n)
最佳情况中进行,方法是检查列表是否已排序,如果是,则中止,但是没有任何情况可以胜过对于任何情况你都无法达到对数的复杂性。
答案 1 :(得分:2)
没有
第一个分区,无论您选择哪个数据透视值,都需要O(n)
时间 - 您需要将每个其他元素与数据透视进行比较。
在此之后你递归并对两个分区做同样的事情 - 枢轴的最佳选择(当每个枢轴是范围的中间值时)最终复杂度为O(n log n)
。枢轴的最差选择(当每个枢轴是范围中的最大值或最小值时)最终会出现O(n^2)
的复杂性。
答案 2 :(得分:1)
没有。为了使排序算法成为正确的算法(即,对于每个可能的输入,它总是产生正确的输出),像Quicksort这样的比较排序算法必须至少进行n * log(n)比较。如果没有,则有一些输入无法确定正确的输出。这最容易从decision tree model可视化,其中每个叶子对应于算法的正确输出。
来自着名的CLRS教科书p193:
从决策树的根到任何一个的最长简单路径的长度 其可到达的叶子表示相应排序算法执行的最坏情况的比较次数。因此,最坏情况下的数字 给定比较排序算法的比较等于其决定的高度 树。每个排列的所有决策树的高度的下限 因此,可到达的叶子显示为任何运行时间的下限 比较排序算法。
决策树的高度为n * log(n)。
答案 3 :(得分:0)
没有。复杂性的概念与私人案例脱节,这就是重点。
答案 4 :(得分:0)
没有排序算法可以对执行少于Ω(n)的操作进行排序, 因为算法必须读取输入。 这是使用对手参数的下限:
如果算法没有读取输入的一部分那么 我们可以改变输入的那一部分而不影响算法的执行, 结果我们可以改变答案但是 算法不会注意到这种变化 因为它没有读那部分。
但是快速排序并没有实现这种下限。 没有基于比较的算法可以 最坏情况(甚至平均情况)运行时间O(n)。 所有这些都需要Ω(n lg n)比较操作。 这可以使用决策树下限参数显示。
QuickSort算法的最佳案例复杂性 (这意味着最佳选择枢轴) 正如Dukeling所解释的那样是Ω(n lg n)。
可以修改算法和 硬编码特定类型输入的答案(如已排序的数组) 更有效,并可能改善最佳案例运行时间。 效率取决于速度有多快 我们可以检查输入是否属于这些特殊情况之一 我们能够以多快的速度为这些特殊情况输出答案。 我们可以检查数组是否已经排序并以线性时间输出。 因此我们可以将任何排序算法的最佳案例复杂度提高到O(n) 通过硬编码这个特例。