代码如下:
# -*- coding:utf-8 -*-
# python实现找到第i小的元素
import random
def RandomizedSelect(li, p, r, i):
'''li为所要操作的列表
p为起始位置
r为结束位置
i表示第i小元素'''
if p == r:
return li[p]
q = RandomizedPartition(li, p, r)
k = q - p + 1
if i == k:
return li[q]
elif i < k:
return RandomizedSelect(li, p, q-1,i)
else:
return RandomizedSelect(li, q+1, r, i-k)
def RandomizedPartition(li, p, r):
'''此函数的功能是先随机出主元,然后一一和主元比较,并相应的交换位置
最后得到,在主元的左边全部小于它,主元的右边全部大于它。'''
e = random.randint(p,r)
li[e],li[r]=li[r],li[e]
x = li[r]
i = p - 1
for j in range(p, r):
if li[j] < x:
i += 1
li[i],li[j] = li[j],li[i]
li[i+1],li[r] = li[r],li[i+1]
return i+1
if __name__ == '__main__':
li = [1,4,6,3,7,9,12,89,34,76,34,87,990]
print RandomizedSelect(li, 0, len(li)-1, 12)