第6章 快速排序
6.1 快速排序的描述
-
过程:
- 分解:将数组分解为数组A[p…r]分解为两个子数组A[p…q-1]和A[q+1…r],使得A[p…q-1]中每一个元素都小于等于A[q],而A[q]也小于等于A[q+1…r]中的每个元素。
- 解决:通过递归调用快速排序,对子数组A[p…q-1]和A[q+1…r]进行排序。
- 合并
-
伪代码:
-
QUICKSORT(A, p, r)
if p < r q = PARTITION(A, p, r) QUICKSORT(A, p, q-1) QUICKSORT(A, q+1, r)
-
PATITION(A, p, r)
x = A[r] i = p - 1 for j = p to r-1 if A[j]<=x i = i + 1 exchange A[i] with A[j] exchange A[i+1] with A[j] return i + 1
-
-
python代码::
def quicksort(array): if len(array) < 2: return array else: pivot = array[0] less = [i for i in array[1:] if i <= pivot] greater = [i for i in array[1:] if i > pivot] return quicksort(less) + [pivot] + quicksort(greater) print(quicksort([10, 16, 4, 10, 14, 7, 9, 3, 2, 8, 1]))
6.2 快速排序的性能
- 最坏情况划分:时间复杂度: θ ( n 2 ) \theta(n^2) θ(n2)
- 最好情况划分运行时间: T ( n ) = θ ( n lg n ) T(n)=\theta(n\lg n) T(n)=θ(nlgn)
- 平衡的划分
6.3 快速排序的随机化版本
-
伪代码:
-
RANDOMIZED-PARTITION(A, p, r)
i = RANDOM(p, r) exchange A[r] with A[i] return PARTITION(A, p, r)
-
RANDOMIZED-QUICKSORT(A, p, r)
if p < r q = RANDOMIZED-PARTITION(A, p, r) RANDOMIZED-QUICKSORT(A, p, q-1) RANDOMIZED-QUICKSORT(A, q+1, r)
-
6.4 快速排序分析
- 最坏情况运行时间: θ ( n 2 ) \theta(n^2) θ(n2)
- 期望运行时间: E [ X ] = O ( n lg n ) E[X]=O(n\lg n) E[X]=O(nlgn)