在文章开头先了解随机快速排序,随机排序之前博文中有,在此增加快速排序中partition函数,参照http://www.cnblogs.com/sdlwlxf/p/5131793.html
Master公式:用于算复杂度
此公式只适用于每次递归量相同的情况,可以简化理解为一下过程:
a表示递归的次数,b表示递归规程中每次递归缩小是的数据量,n^d为递归后续行为的复杂度。比如,数据量为n,归并排序时复杂度=前n/2的复杂度+后n/2的复杂度+将这两个n/2合并成一个数组时的复杂度。
bfprt算法原理:
在无序数组中,找到最小或最大第k个数的算法思想:
在快速排序或是随机快速排序中,步骤为:1、用速排序或是随机快速排序方法找X 2、partition函数把数组排成 >x ==x <x 3、看==x的下标分为是否包含k
若在即可得到第k个数,若不在,则在>x 或<x 中步骤1 开始重新查找,直至找到。此方法的平均复杂度为O(n),但单次复杂度不一定是。
bfprt算法只是在选择划分值的策略上不一样,其他的与快排一样。
bfprt算法的划分策略是:1、将数组每五个划为一组,不够5个单列一组 复杂度O(1)
2、每个组中的数据进行组内排序 复杂度O(n)
3、把每个组中的中位数拿出,组成一个新的数组 n/5 复杂度O(n)
4、求出n/5这个数组的中位数,这个数在数组中是第n/10个数,用重复调用自己的方法来找。此处的中位数就是所要找的划分值 F(n/5)
5、partition函数把数组排成 >x ==x <x 复杂度O(n)
6、看==x的下标分为是否包含k若在即可得到第k个数,若不在,则在>x 或<x 中步骤1 开始重新查找,直至找到。
假设五组已经排好的序列,X出为最后找的中位数,在数组的n/10的位置上。<=这个值的有n*3/10,>这个值的为n*7/10
整个复杂度:F(n)=F(n/5)+F(n*7/5)+O(n)