BFPRT算法:时间复杂度O(n)求第k小的数字(分治算法+快排)
各位小伙伴,由于本篇文章代码太过杂乱。我于 2018年12月25日 对文中介绍的算法进行了重写。点击上面的蓝色字体,可以阅读重写后的文章,修复了一些存在的错误。
最容易想到的算法是采用一种排序算法先将数组按不降的次序排好,然后从排好序的数组中捡出第k个元素。这样的算法在最坏情况下时间复杂度是O(nlog2^n)。
实际上,我们可以设计出在最坏情况下的时间复杂度为O(n)的算法。
利用分治算法并结合快排思想,很容易达到O(n)的时间复杂度。其核心思想在于快排中基准的选取。(根据严蔚敏版教材,一般直接选取第一个元素作为快排基准。但求第k小元素,则依赖于一种中值选取法,以加速剪枝)。
阅读以下内容时,需要先学习快排算法,可以看看这篇文章《[Data Structure]九大内部排序算法》。
下面举个例子,如何达到O(n