1.问题
寻找第k小个元素:特定分治策略
2.解析
3.设计
输入:n个数的数组S,正整数k
输出:S中的第k小元素
1.将S划分成5个一组,共⌈n/5⌉个组
2.每组找一个中位数,把这些中位数放到集合M中
3. m<-Select(M, ⌈|M|/2⌉)
//选M的中位数m,将S中的数划分成A,B,C,D四个集合
4.把A和D中的每个元素与m比较,小的构成S1,大的构成S2;
5.S1<-S1UC;S2<-S2UB;
6. if k=|S|+1 then 输出m
7. else if k≤|S1|
8. then Select(S1,k)
9. else Select(Sa,k-|Sl|-1)
int select_rank_k(int A[], int low, int high, int k)
{
int r_group = ceil((high - low + 1)*1.0 / r);
for (int i = 1; i <= r_group; ++i) {
sort(&A[low + (i - 1)*r], &A[(low + i*r - 1) > high ? high : (low + i*r - 1)]);
swap(A[low + i - 1], A[low + (i-1)*r + r / 2]);
}
sort(&A[low], &A[low + r_group]);
swap(A[low], A[r_group / 2]);
int cur = partition(A, low, high);
if (cur == k-1){
return A[cur];
}
else if (cur < k){
return select_rank_k(A, cur + 1, high, k);
}
else{
return select_rank_k(A, low, cur - 1, k);
}
}
4.分析
时间复杂度:
T(n)=O(n)
5.源码
https://github.com/Adrianna-Yu/algorithm/blob/main/DaC