当发生以下两种情况之一时,最坏情况下正常快速排序的时间复杂度为O(n ^ 2):
在上述两种情况下,PARTITION算法将数组划分为两个子部分,一个包含(n-1)个元素,第二个包含0个元素
为避免这种不良情况,我们使用另一种版本的QuickSort,即随机快速排序,其中选择随机元素作为枢轴。随机快速排序的预期T.C是 theta(nlogn)。
我的问题是,对于什么输入/情况,randmized Quick-Sort会导致O(n ^ 2)的最差时间复杂度?
答案 0 :(得分:2)
如果输入包含完全相同的元素,则随机快速排序的运行时为O(n ^ 2)。假设您使用与确定性版本相同的PARTITION算法。分析完全相同。
这是一个随机快速排序的实现,它计算执行的比较次数:
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