算法导论之中位数与顺序统计量(2)

本文详细解析了一种能在线性时间内找到数组中第k大的数的选择算法。该算法通过将数组划分成多个子数组,并对这些子数组进行排序来找到中位数的中位数。进一步将原数组按中位数的中位数划分,递归查找目标值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最坏时间为线性时间的选择算法

对《算法导论》上的5步进行逐步解析:

Step 1:把数组划分为若干个子数组,每个子数组里包含5个数,因为会有无法整除的可能,所以最后一个子数组会小于5.

Step 2:用插入排序把这5个数排序,然后找出中位数,也就是第3个。

Step3:把获得的中位数又排序,找出中位数的中位数x。如果中位数的个数是偶数,那么取排好序的第 m/2 个数,m指的是中位数的个数。

Step4:把原来的数组使用类似快排的方法,分成两个部分。一部分比x大,一部分比x小。我们可以假设左边的数大,右边的数小。然后我们可以得到“中位数的中位数”的位置i.

Step5:如果i =k, 那么那个“中位数的中位数”就是第k大的数。如果 i< k, 不用说,第k大的在x的右边,否则就在左边。递归调用该算法即可。

经过数学公式的验证,此算法的最差时间复杂度为O(n)。

本算法的关键之处在于将插入排序和快排融合到了同一个算法中,对于5个的元素进行插

入排序,对之前排的差不多有序的元素进行快排,这样会很节省时间。这是算法能达到最差

时间复杂度为O(n)的原因。

算法的解析如下图:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值