顺序统计量:第i个顺序统计量是由n个元素组成的集合中第i小的元素。
选择问题:输入一个包含n个互异的数的集合A和一个整数i(1≤i≤n),输出元素x∈A,且A中恰好有i-1个元素小于它。
期望为线性时间的选择算法伪代码:思想与随机快速排序类似,但只处理排序好的一边
randomSelect(A,p,r,i):
if p==r:
return A[p]
q=randomPartition(A,p,r)
k=q-p+1
if i==k:
return A[q]
else if i<k:
return randomSelect(A,p,q-1,i)
else: return randomSelect(A,q+1,r,i-k)
python 代码:
import random def partition(A,p,r): ro=random.randint(p,r) A[ro],A[r]=A[r],A[ro] x=A[r] i=p-1 for j in range(p,r): if A[j]<=x: i=i+1 A[i],A[j]=A[j],A[i] A[i+1],A[r]=A[r],A[i+1] return i+1 def randomSelect(A,p,r,i): if p==r: return A[p] q=partition(A,p,r) k=q-p+1 if i==k: return A[q] elif i<k: return randomSelect(A,p,q-1,i) else: return randomSelect(A,q+1,r,i-k) if __name__=="__main__": A=[2,0,9,5,4,7] v=randomSelect(A,0,len(A)-1,3) print(v)