为什么快速选择排序时间复杂度平均O(n)-转载

一、引言

今天学了一个快速选择算法,这个算法跟快排差不多,只不过专门用来在选择数组中第k大/小的数时,可以免去将整个数组排序后选择第k个数。将整个数组排序再选择第k个数的时间复杂度是O(nlog(n)),快速选择算法将平均时间复杂度优化到O(n),但最坏的情况还是O(n^2)。一开始很纠结这个O(n)是怎么来的,后来看了一下别人的分析,得到了答案。

二、分析

这里大概分析一下O(n)怎么来的,可能不是很严谨。

(1)快速选择算法,每次根据pivot(枢纽值)将数组分成左部分和右部分以后,根据k值的大小选择下一次进入左部分还是右部分,我们把数组分成左右部分的过程叫partition。

(2)假设用随机选择算法取得的枢纽值总是在数组的中间,那每次都会将数组分成等长(或长度相差1)的两半,再假设如果一直到最后子数组长度为1才找到第k大/小的值,那就一共要进行⌊logn⌋+1次partition。

(3)第一次partition要遍历的长度是n,第二次要遍历的长度是n/2,第三次要遍历的长度是n/4……倒数第二次遍历的长度是2,最后一次遍历的长度是1。这是一个首项为1,公比为2的等比数列,记ax=2^(x-1),其中x为项数。这个等比数列的前x项和为2^x-1(等比数列的求和公式为Sx=(a1-ax*q)/(1-q))。因为一共要求⌊logn⌋+1次partition,而S(⌊logn⌋+1)=2^(⌊logn⌋+1)-1≈2n-1(大概是这样,会有误差,但主要是看数量级。数学这方便确实比较菜嘻嘻),所以时间复杂度是O(2n-1)=O(n)。

————————————————

版权声明:本文为CSDN博主「W__M__W」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/W__M__W/article/details/105684438

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值