快速选择算法c++
Quick Selection原理
Quick Selection算法和Quick Sort算法是由同一个作者提出,这两者之间有很大的相似之处——分治,即将问题的规模一次次的减小,直到求出最终解,时间复杂度O(n),且数据无需有序。
目标:找到第n大的数
- 随机产生一个pivot
- 根据这个pivot,将小于其值的数放左边,大于其值的数放右边
- 更新第n大数的估计值的位置,选择其中一边,直到=n
- 重复2、3步骤.
操作的情况大致如下图所示:v即为pivot
Quick Selection复杂度分析
假设找的数以平均情况计算(被找的数每次都在中间部分),令O(N)为总的时间复杂度,N+O(N/2)为第O(N)次查找所需要的时间。按照以下公式进行递推,可以推出,最终O(N)近似等于2N,即O(N)=N。
而最坏情况时(被找的数每次都在最边上)O(N)=N2。当然也不用过于担心,有很多方式,通过重新洗牌,使数据尽量的无序,达到平均情况。(Shuffle、Turkeys’s ninth 等还是挺不错的)