BFPRT算法及其C++代码实现

BFPRT算法的应用场景:

在一个数组中求第k个大的值或第k个小的值

BFPRT可以使用O(N)的时间复杂度解决该问题。

 

BFPRT算法是在随机快速排序算法进行优化的,随机快速排序的思路如下:

1)随机的选取一个元素与最后一个元素进行交换位置,随机选取的数成为最后一个元素

2)遍历数组  小于最后一个元素的放在左边  大于最后一个元素的放在右边

3)将最后一个元素放到中间位置

经过上面的过程后数组分为三部分  小于随机选取的数  等于随机选取的数  大于随机选取的数

 

BFPRT算法是在以上算法进行的优化,算法的时间复杂度严格的O(N)

随机选取一个元素变为选取中位数

步骤如下:

1)将数组分为5个一组的多个数组 不足五个的形成一组O(N)

2)组内进行排序O(N)

3)每个数组中位数取出构成新的数组O(N)

4)递归的调用BFPRT 直到得到一个数组只剩一个数 返回T(N/5)

以上均为选取元素的部分

5)小于中位数左边 等于中位数中间 大于中位数右边O(N)

6)如果第K个值在左边 递归左边  在右边 递归右边  中间  返回

当数组的个数是N个时  排序之后得到中位数数组N/5 而求这N/5的中位数   这N/5个中位数中有N/10个元素比中位数大,所以所有的元素中至少有3N/10个元素比选出的中位数大,所以至少有7N/10个元素比中位数小

所以在步骤6中最坏情况是T(7N/10)

T(N)=T(N/5)+T(7N/10)+O(N)

例子如下:

数组:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 第10小的数

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值