1. 程式人生 > >005_010 Python 選擇序列中最小的第n個元素

005_010 Python 選擇序列中最小的第n個元素

程式碼如下:

#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