一、随机化原理
-
经典快速排序 选取固定的“枢轴”(通常取第一个或最后一个元素),在最坏情况下(如已经有序)会退化为
。
-
随机快速排序 在每次分区前随机地从当前区间 [p..r] 中等概率选取一个枢轴,将它与末尾元素交换,再做标准分区。
-
随机化保证任意输入上每个元素都有同样概率被选为枢轴,从而平均下能避免极端不平衡的划分,取得期望
。
二、算法步骤
-
入口调用
调用RQS(A, 1, n)
对长度为 n 的数组 A 进行排序。 -
递归基
若子区间长度小于等于 1(即 p≥r ),直接返回。 -
随机选枢轴
在 [p,r] 上用RANDOM(p,r)
等概率选出下标 i ,交换A[i]
与A[r]
,这样A[r]
就是随机枢轴。 -
分区(Partition)
以A[r]
为枢轴做一次线性扫描,将 ≤ 枢轴的都移动到左边,返回枢轴最终位置 q 。 -
递归排序
分别对左右两段A[p..q-1]
和A[q+1..r]
递归调用RQS
。
三、伪代码
RQS(A, p, r)
1 if p < r
2 // 随机化选枢轴
3 i ← RANDOM(p, r)
4 swap A[i] ↔ A[r]
5
6 // 标准 Partition
7 q ← PARTITION(A, p, r)
8
9 // 递归排序左右子区间
10 RQS(A, p, q-1)
11 RQS(A, q+1, r)// Partition: 以 A[r] 为枢轴,返回最终位置
PARTITION(A, p, r)
1 x ← A[r]
2 i ← p − 1
3 for j = p to r − 1
4 if A[j] ≤ x
5 i ← i + 1
6 swap A[i] ↔ A[j]
7 swap A[i+1] ↔ A[r]
8 return i + 1
四、时间复杂度推导
(一)最坏情况
-
若每次随机恰巧选到当前子数组最小或最大元素,分区极端不平衡:
(二)期望/平均情况
令 T(n) 为对长度为 n 的数组运行的期望时间。
-
随机选枢轴后,其秩 k 在 {1,2,…,n} 上均匀分布。
-
若枢轴落在第 k 小位置,则子问题规模为 k−1 和 n−k 。
这一递归可通过替换法或主定理分析得出: