代码如下:
#encoding=utf-8
print '中国'
#选择序列中最小的第n个元素
#如果序列很长 ,而且洗牌很充分 排序的复杂度为logn 下面为O(n)的算法 最小元素师第0个 获取第n个最小的
import random
def seln(data,n):
data = list(data)
if n < 0:
n += len(data)
if not 0 <= n <= len(data):
return None
while True:
pivot=random.choice(data)
pcount=0
under,over=[],[]
underappend,overappend=under.append,over.append #重要优化,python不会再内层中缓存结果
for elem in data:
if elem < pivot:
underappend(elem)
elif elem > pivot:
overappend(elem)
else:
pcount += 1
numunder = len(under)
if n < numunder:
data = under
elif n < numunder + pcount:
return pivot
else:
data = over
n -= numunder + pcount
data=[2,3,4,5,71,18,10,3,5,7]
print seln(data,8)
打印结果如下:
中国
18