选择算法
本节介绍一种解决选择问题的分治算法,以快速排序算法为模型,与快速排序算法一样,我们仍然将输入数组进行递归划分,但与快速排序算法不同的是,快速排序会递归处理划分的两边,而选择算法只处理划分的一边,快速排序期望的运行时间为
O
(
n
l
g
n
)
O(nlgn)
O(nlgn),而选择算法期望的运行时间为
O
(
n
)
O(n)
O(n)
python实现代码如下,它返回数组
A
[
p
.
.
r
]
A[p..r]
A[p..r]中第
i
i
i小的元素:
# -*-coding:utf8 -*-
import sys
import random
#数组划分函数
def partition(A,p,r):
#用最后一个值作为左右分割值
x = A[r]
i = p - 1
for j in range(p,r):
if A[j]<=x:
i+=1
temp = A[i]
A[i] = A[j]
A[j] = temp
temp = A[i+1]
A[i+1] = A[r]
A[r] = temp
return i+1
#随机选择主元素,保证平衡划分
def randomized_partition(A,p,r):
i = random.randint(p,r)
# exchage A[r] with A[i]
temp = A[r]
A[r] = A[i]
A[i] = temp
return partition(A,p,r)
def randomized_select(A,p,r,i):
if p == r:
return A[p]
q = randomized_partition(A, p, r)
k = q-p+1
if i == k:
return A[q]
elif i<k:
return randomized_select(A, p, q-1, i)
else:
#在A[q+1,r]中的第i-k小的元素
return randomized_select(A, q+1, r, i-k)
if __name__=='__main__':
A = [2,8,7,12,10,51,16,4]
print(A)
x = randomized_select(A,0,len(A)-1, 3)
print(x)