给定一个序列A[1…n],寻找第 k 小元素
借用随机快排的 partition 函数
Rand_Select(A, p, r, i) // from A[p] to A[r] to find the element of number i
if p = q then return A[p]
r = Rand_Partition(A, p, q)
k = r - q + 1 // k = rank(A[r]) in A[p…q]
if i==k then return A[r]
if i<k then
return Rand_Select(A, p, r-1, i)
else
return Rand_Select(A, r+1, q, i-k)
- analysis
(assume elements are distinct)
lucky case 1/10 9/10:
T(n) = T(9/10 × \times × n) + Θ(n)
= Θ(n)
unlucky case 0 n-1
T(n) = T(n-1) + Θ(n)
= Θ(n2)
期望运行时间:
令T(n) 为一个随机变量
定义指示器随机变量 Xk,k=0,1,2…
X k = { 1 数 组 被 分 割 成 k 和 n − k + 1 两 段 0 其 他 X_k=\begin{cases} 1 & 数组被分割成 k 和 n-k+1两段\\ 0 & 其他 \end{cases} Xk={ 10数组被分割成k和n−k+1两段其他
T ( n ) = { T ( m a x { 0 , n − 1 } ) + Θ ( n ) 0 : n − 1 s p l i t T ( m a x { 1 , n − 2 } ) + Θ ( n ) 1 : n − 2 s p l i t . . . T ( m a x { n − 1 , 0 } ) + Θ ( n ) n − 1 : 0 s p l i t T(n)=\begin{cases} T(max\{0, n-1\}) + Θ(n) & 0:n-1 split \\ T(max\{1, n-2\}) + Θ(n) & 1:n-2 split \\ ... \\ T(max\{n-1, 0\}) + Θ(n) & n-1:0 split \end{cases} T(n)=⎩⎪⎪⎪⎨⎪⎪⎪⎧T(