BFPRT算法解决的问题十分经典,即从某n个元素的序列中选出第k大(第k小)的元素,通过巧妙的分 析,BFPRT可以保证在最坏情况下仍为线性时间复杂度。该算法的思想与快速排序思想相似,当然,为使得算法在最坏情况下,依然能达到o(n)的时间复杂 度,五位算法作者做了精妙的处理。 算法步骤: 1. 将n个元素每5个一组,...
即划分之后,任意一边的长度至少为3/10,在最坏情况下,每次选择都选到了7/10的那一部分,则递归的复杂度为T(7/10*n)。 在每5个数求中位数和划分的函数中,进行若干个次线性的扫描,其时间复杂度为c*n,其中c为常数。其总的时间复杂度满足T(n) <= T(n/5) + T(7/10*n) + c * n。 我们假设T(n...
cn是我们使用插入排序进行多次排序的复杂度,这里的c是一个常数。 我们很容易可以证明T(n)=T(\frac{n}{2}) + cn和T(n)=T(\frac{7n}{10}) + cn都是O(n)的复杂度,这里我们证明一下前者作为一个例子: \displaystyle\begin{aligned} T(n) &= T(\frac{n}{2}) + cn \\ T(\frac{n}{2}) &...
不通过排序求第k小的数,时间复杂度为O(N)。 主要是利用快排中的partition过程。 1、找到一个划分值,按照partition的过程,分为小于区、等于区、大于区,则可知等于区是在整个数组有序后不变的部分。 2、求第K小的数,就是数组有序后下标为k-1的数。 3、所以,如果等于区包含这个k-1,则等于区的数就是第k...