BFPRT 算法
又称为 “中位数的中位数算法”,该算法由 Blum、Floyd、Pratt、Rivest、Tarjan 在1973年提出,最坏时间复杂度为 O(n),最差的空间复杂度为O(logn)。
算法步骤
(1):将 n 个元素划分为 ⌊n/5⌋ 个组,每组 5 个元素,若有剩余,舍去;
(2):使用排序方法找到 ⌊n/5⌋ 个组中每一组的中位数;
(3):对于(2)中找到的所有中位数,递归(1)(2)查找中位数的中位数,作为Partition划分过程的主元
(4):进行Partition划分,即一次快排
(5):判断主元的位置与 k 的大小,有选择的对左边或右边递归。
算法应用
BFPRT算法的一个经典应用就是TOP-K问题,即在一组数据中寻找第K大或第K小的元素。
这类问题可以分为对数据完全排序,部分排序和不排序。
完全排序情况下可以使用快速排序等排序方法能达到O(nlogn)的时间复杂度。
部分排序可以使用冒泡排序,选择排序等方法也能达到O(kn)的时间复杂度。
不排序的情况可以使用堆排序的方法,时间复杂度为O(nlogk)。
而BFPRT算法解决这类问题能达到O(n)的时间复杂度!!
实现代码
#include <iostream>
#include <algorithm>
using namespace std;
int array[]={
1,12,3,4,1,5,2,