import random
defkthSmallest(data, k):"Find the nth rank ordered element (the least value has rank 0)."
data =list(data)ifnot0<= k <len(data):raise ValueError('not enough elements for the given rank')whileTrue:
pivot = random.choice(data)
pcount =0
low, high =[],[]for elem in data:if elem < pivot:
low.append(elem)elif elem > pivot:
high.append(elem)else:
pcount +=1if k <len(low):
data = low
elif k <len(low)+ pcount:return pivot
else:
data = high
k -=len(low)+ pcount
递归形式
defkthSmallest(data, k):ifnot0<= k <len(data):raise ValueError('not enough elements for the given rank')
pivot = random.choice(data)
pcount =0
low, high =[],[]for elem in data:if elem < pivot:
low.append(elem)elif elem > pivot:
high.append(elem)else:
pcount +=1if k <len(low):return kthSmallest(low, k)elif k <len(low)+ pcount:return pivot
else:return kthSmallest(high, k-len(low)-pcount)
测试
A =[i for i inrange(1000)]
random.shuffle(A)for i inrange(len(A)):assert(kthSmallest(A, i)== i)