1. 程式人生 > >Python實現返回陣列第i小的元素

Python實現返回陣列第i小的元素

#! /usr/bin/env python
#coding=utf-8
#期望為線性時間的選擇演算法
import random
class RandomSelect(object):
    def Partition(self,a, p, r):
        x=a[r]
        i=p-1
        for j in range(p, r):
            '''如果a[j]>x,則只需將j的值加1即可使迴圈不變數繼續保持;
            如果a[j]<=x,則將下標i的值加1,並交換a[i]和a[j],再將
            j的值加1.此時迴圈不變數同樣得到保持'''
if a[j]<=x: i=i+1 a[i], a[j]=a[j], a[i] a[i+1], a[r]=a[r], a[i+1] return i+1 def RandomPartition(self,a, p, r): i=random.randint(p, r) #生成的隨機數為p=<i<=r a[r], a[i]=a[i], a[r] return self.Partition(a, p, r) def
randomSelect(self,a,p,r,i):
if p==r: return a[p] q=self.RandomPartition(a,p,r) k=q-p+1 if i==k: return a[q] elif i<k: return self.randomSelect(a,p,q-1,i) else: return self.randomSelect(a,q+1,r,i-k) if
__name__ == '__main__': a=[random.randint(0,20) for i in range(10)] print a #a=sorted(a) #print a r=RandomSelect() r.randomSelect(a,0,len(a)-1,3) print a[2]#陣列中的第三小的數 a=sorted(a) print a