随机快速排序最坏情况时间复杂度

时间:2017-08-20 08:17:05

标签: algorithm sorting quicksort

当发生以下两种情况之一时,最坏情况下正常快速排序的时间复杂度为O(n ^ 2):

  1. 输入已按升序或递减顺序排序
  2. 输入数组中的所有元素都相同
  3. 在上述两种情况下,PARTITION算法将数组划分为两个子部分,一个包含(n-1)个元素,第二个包含0个元素

    为避免这种不良情况,我们使用另一种版本的QuickSort,即随机快速排序,其中选择随机元素作为枢轴。随机快速排序的预期T.C是 theta(nlogn)

    我的问题是,对于什么输入/情况,randmized Quick-Sort会导致O(n ^ 2)的最差时间复杂度?

1 个答案:

答案 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