BFPRT算法是求数组中第k小(大)的数,时间复杂度为O(n)
其算法思路与快排类似。
只不过选择标杆值不一样,BFPRT是选择中位数组的中位数来当pvalue,而快排是随机选择。
选择之后,进行递归调用,
具体实现,请看代码:
#ifndef BFPRT_H
#define BFPRT_H
//BFPRT算法是在不排序的情况下,找到第k小,或者第k大的数
//这里以第k小的数为例,进行算法实现
//1、首先对数组进行分组,5个为1组,最后不足5个的为1组,一共有num/5或者1+num/5组
//2、对每组进行插入排序,排好序后,取每个组的中位数,组成中位数数组mediums[n]
//3、然后,求出mediums数组中的上中位数pvalue,这里递归调用BFPRT算法
//求mediums数组中的上中位数,就是求该数组中,第mediums.size()/2个数
//4,此时pvalue,就是得到的划分值。然后进行与快排里面的partition函数一样的划分区域
//小于pvalue的在小于区,等于的在等于区,大于的在大于区。如果要求得第k小的数,在等于区
//也就是说k-1作为下标,在等于区的下标范围内,那么直接返回pvalue,
//如果k-1小于等于区的左边界下标,说明在小于区内,继续partition,同理,大于区内也一样。
//这里,因为确定了在小于区,就不用管大于区,所以递归只走