如果输入包含所有相同的元素,则randomized quick-sort的运行时为O(n^2)。这是假设您使用与确定性版本相同的分区算法。分析结果是相同的。
下面是随机quicksort的一个实现,它计算执行的比较数:
import random
def quicksort(A, lo, hi):
if lo >= hi:
return 0
p, compares = partition(A, lo, hi)
compares += quicksort(A, lo, p - 1)
compares += quicksort(A, p + 1, hi)
return compares
def partition(A, lo, hi):
r = random.randrange(lo, hi+1)
A[r], A[hi] = A[hi], A[r]
pivot = A[hi]
i = lo - 1
compares = 0
for j in xrange(lo, hi):
compares += 1
if A[j] < pivot:
i = i + 1
A[i], A[j] = A[j], A[i]
compares += 1
if A[hi] < A[i + 1]:
A[i + 1], A[hi] = A[hi], A[i + 1]
return i + 1, compares
for x in xrange(10, 510, 40):
compares = quicksort([1] * x, 0, x-1)
print x, compares
输出清晰地显示了O(n^2)个运行时:
10 54
50 1274
90 4094
130 8514
170 14534
210 22154
250 31374
290 42194
330 54614
370 68634
410 84254
450 101474
490 120294
我想展示Quicksort空间复杂性的最坏情况。 我在想它,快速排序不使用辅助数组,它只是在分区子程序上创建一些辅助变量,但它只是操作数组中的项目。所以,很明显,我的结论是它使用了O(n)空间。 但我在网上搜索发现,Quicksort在最坏情况下的空间复杂度为O(logn)。 我只是不明白为什么在最坏的情况下,它比输入数组占用的空间更少? ps:我在看《算法导论》这本书。 我已经尝试的是计算算法中
因为最坏情况下的快速排序复杂度为O(n^2) 在递增顺序的情况下,当pivot选择第一个或最后一个元素时,它给出了正确的最坏情况复杂度O(n^2),因为树的一个子元素总是空的 但是当枢轴选择中间时,我感到困惑?它将树分成两半,使其复杂性O(n.logn) 假设10 20 30 40 50 60 70枢轴=40 (10 20 30 ) 40 (50 60 70) 左侧枢轴20,右侧枢轴60 (10)
我有一个关于计算时间复杂度的非常普遍的问题(大O符号)。当人们说QuickSort最差的时间复杂度是O(n^2)(每次都选择数组的第一个元素作为轴心,并且数组是反向排序的)时,他们考虑了哪个操作来获得O(n^2)?人们会计算if/else语句所做的比较吗?或者他们只计算其进行的互换的总数?一般来说,你如何知道计算大O符号需要计算哪些“步骤”。 我知道这是一个非常基本的问题,但我已经阅读了谷歌上几乎
本文向大家介绍快速排序的最优情况?相关面试题,主要包含被问及快速排序的最优情况?时的应答技巧和注意事项,需要的朋友参考一下 参考回答: 快速排序的最优情况是Partition每次划分的都很均匀,当排序的元素为n个,则递归树的深度为。在第一次做Partition的时候需对所有元素扫描一遍,获得的枢纽元将所有元素一分为二,不断的划分下去直到排序结束,而在此情况下快速排序的最优时间复杂度为。
我必须找到在c程序中输入最佳情况的快速排序的时间复杂度