BFPRT算法C++实现

本文介绍了BFPRT算法,一种寻找数组中第k小元素的算法,时间复杂度为O(n)。算法过程包括数组分组、插入排序、获取中位数、划分区域等步骤,并给出了详细的C++代码实现。
摘要由CSDN通过智能技术生成
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,同理,大于区内也一样。
//这里,因为确定了在小于区,就不用管大于区,所以递归只走
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值