#! /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
Python实现返回数组第i小的元素
最新推荐文章于 2023-02-21 03:05:06 发布