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小的数