期望线性时间的选择算法
def select(list1,l,r,i):#i表示第i小的元素
if l == r:
return list1[l]
if l < r:
x = random.randint(l,r)
list1[r],list1[x] = list1[x],list1[r]
key = list1[r]
s = l
for j in range(l,r):
if list1[j] < key:
list1[s],list1[j] = list1[j],list1[s]
s += 1
list1[r],list1[s] = list1[s],list1[r]
k = s - l + 1
if i == k:
return list1[s]
elif i < k:
return select(list1,l,s-1,i)#此处return 必须加!
else:
return select(list1,s+1,r,i-k)#此处return 必须加加!!
print(select(li,0,len(li)-1,5))