- 问题
选第k小元素:特定分治策略” - 解析
以S中的某个元素m作为划分标准,将S划分为两个子数组S1和S2,把这个数组中比m小的都放入S1的数组中,数组S1的元素个数是|S1|个;把这个数组中比m*大的都放入S2的数组中,数组S2的元素个数是|S2|个。
若k<|S1|,则原问题归纳为在数组S1中找第k小的子问题。
若k=|S1|+1,则m就是要找的第k小元素。
若k>|S1|+1,则原问题归纳为在数组S2中找第n−|S1|−1小的子问题。
3.设计
select(s,k)
输入:n个数的数组S,正整数k
输出:S中最小的数k
1.将S划分成5个一组,共[n/5]个组
2.每组找一个中位数,把这些中位数放到集合M中
3.m<-select(M,[|M|/2) //选中M的中位数,将S划分成A,B,C,D,四个集合
4.把A和D中的每个元素与m比较,小的构成S1,大的给构成S2
5.S1<-S1UC; S2<-S2UB;
6.if k=|S1|+1 then 输出m
7.else if k<=|s1|
8. then select(S1,k)
9. else select(S2,k-|S1|-1)
4.分析
O(n)