① 先判断是否需要进行随机划分即( kϵ( 1, n) ? n>1?);
② 产生随机数 j,选择划分基准,将 a[j]与 a[l]交换;
③ 以划分基准为轴做元素交换,使得一侧数组小于基准值,另一侧数组值大于基准值;
④ 判断基准值是否就是所需选择的数,若是,则输出;若不是对子数组 重复步骤②③
import time
import random
def look_for(L,left,right):
m=random.randint(left,right)#产生随机数
n=L[left]
L[left]=L[m]
L[m]=n #完成随机值与left交换
if(left>=right):
return L[left]
if(left<=right):
i=left
j=right
key=L[left]
while i<j:
while i < j and key<=L[j]:
j-=1
L[i]=L[j]#从右往左找到一个比key小的,将其赋值给基准值
while i<j and L[i]<=key:
i+=1
L[j]=L[i]#从左往右找到一个比key大的,将其赋值给
L[i]=key
#已完成左侧比key小,右侧比key大
if(len(L)%2==0 and i==int(len(L)/2)-1):
return key
elif(len(L)%2!=0 and i==int(len(L)/2)):
return key
if(i>int(len(L)/2)-1):
return look_for(L,left,i-1)
else:
return look_for(L,i+1,right)
begin=time.clock()
a=[6,1,2,7,3,4,5,8,9]
m=look_for(a,0,len(a)-1)
end=time.clock()
print(m)
print(end-begin)