Quick Selection(快速选择算法)

常年见到快速排序算法,当在普林斯顿大学的网课上看到这个Quick Selection算法的时候,直接蒙住了——这个是什么,和快速排序有什么关系啊?

于是迅速查阅了*,大致了解了其思想,再结合课程中的ppt,终于搞明白了。不得不说这是个很巧妙的算法,把原先要nlogn复杂度的问题,简化为logn.

想起来以前在竞赛和面试时候碰到过类似的情况,都是要找出第n大的数,当时第一个想到的就是排序,然后再通过定位来求解。这回是长记性了,哪有不用更高效算法的道理呢?!


Quick Selection原理

Quick Selection算法和Quick Sort算法是由同一个作者提出,这两者之间有很大的相似之处——分治,即将问题的规模一次次的减小,直到求出最终解。

目标:找到第n大的数

  1. 随机产生一个pivot
  2. 根据这个pivot,将小于其的数放左边,大于其的数放右边
  3. 更新第n大数的估计值的位置,选择其中一边,直到=n
  4. 重复2、3步骤

操作的情况大致如下图所示:v即为pivot

Quick Selection(快速选择算法)

Quick Selection复杂度分析 

假设找的数以平均情况计算(被找的数每次都在中间部分),令O(N)为总的时间复杂度,N+O(N/2)为第O(N)次查找所需要的时间。按照以下公式进行递推,可以推出,最终O(N)近似等于2N,即O(N)=N。

而最坏情况时(被找的数每次都在最边上),Quick Selection(快速选择算法)。当然也不用过于担心,有很多方式,通过重新洗牌,使数据尽量的无序,达到平均情况。(Shuffle、Turkeys's ninth 等还是挺不错的)

Quick Selection(快速选择算法)

来自算法课程 PPT,其计算得出的结果

Quick Selection(快速选择算法)
标题