Randomized-select算法:
渐近运行时间O(n)
与快速排序一样,我们仍然将输入数组进行递归划分,但与快速排序不同的是,快速排序会递归处理划分的两边,而Randomized-select只处理划分的一边。
下面的代码中返回数组A[p...r]中的第i小的元素。
假设输入元素都是互异的。
def randomized_select(A,p,r,i):
if p==r:
return A[p]
q=randomized_partition(A,p,r)
k=q-p+1
if i==k:
return A[q]
elif i < k:
return randomized_select(A,p,q-1,i)
else:
return randomized_select(A,q+1,r,i-k)
import random
def randomized_partition(A,p,r):
i = random.randint(p,r)
t=A[r]
A[r]=A[i]
A[i]=t
x=A[r]
i=p-1
for j in range(p,r):
if A[j]<x:
i+=1
t=A[i]
A[i]=A[j]
A[j]=t
A[r]=A[i+1]
A[i+1]=x
return i+1
运行结果:
>>> A=[90,22,334,55,2,4,56,0,11,11,1]
>>> randomized_select(A,0,10,9)
56