思想方法:
既然是线性时间查找元素,那么我们每次划分时都需要均衡划分。所以我们每次总是取中位数辅助数组B的中位数x为原数组A的主元进行划分。
该算法分5步:
1.将输入数组的n个元素划分为floor(n/5)组,每组5个元素,且至多只有一个组由剩下的nmod5元素组成。
2.寻找ceil(n/5)个组中每一组的中位数。首先对每组中的元素(至多为5个)进行插入排序,然后从排序过的序列中选出中位数。
3.对第2步中找出ceil(n/5)个中位数,递归调用SELECT以找出其中位数x.(如果有偶数个中位数,根据决定,x是较小的中位数)
4.利用修改过的PARTITION过程,按中位数的中位数x对输入数组进行划分。让k比划分低区元素数目多1,所以x是第k小的元素,并且由n-k个元素在划分的高区。
5.如果i=k,则返回x,否则,如果i<k,则在低区递归调用SELECT以找出第i小的元素,如果i>k,则在高区找第i-k个最小元素。
思考过程: