无聊写排序之 ----第K最值(nth_element)

本文介绍了如何在乱序序列中寻找第K个元素,重点讲解了STL中的nth_element算法,它能在O(N)的时间复杂度内完成任务,而不保证其他元素的顺序。与partial_sort的区别在于,nth_element仅确保第K个元素位置正确,而不需要整个前K个元素区间有序。通过实例展示了算法的工作原理和使用方法。
摘要由CSDN通过智能技术生成

之前partial_sort有讲述了如果从一个无序序列中快速获得top m的所有有序数列m个。我们也常常会遇到这样的问题:如何在一个乱序的序列集合中,找到第K大的或者排名第K的那个元素?或者找到前K个排名的元素,但是这K个数之间的顺序对我们来说并不重要。比如篮球比赛中总胜利场数最多的20支球队进入总决赛,而这20支球队之前各自胜利多少的排名并不重要,因为决赛要重新比。 这个问题我们同样可以用排序来解决,最简单的方法也是将所有序列集合进行排序,直接取第K个位置上的数即可,但是这里我们要介绍一种线性时间复杂度(O(N))的算法:nth_element 该算法也来自于STL的算法库,在研究STL源码时看到的,瞬间眼前一亮,这里分享出来。

nth_element算法将重新排列区间[first, last)的序列元素, 使得第k个元素位置的元素在最终算法执行完毕后和整个区间完全排序后该位置元素具有相同的值,也就是说完全排序后该位置上出现的值,将会在该算法执行完成后依然在该位置。但是该算法并不保证位于第K个元素两边的区间的元素有序,只保证[ k, last)区间内没有元素不小于第K个元素位置的值。 看上去和我们之前讲解的partial_sort做的事情很像,但是他们有一个很大的区别在于。nth_element对于除第K位置的元素之外的区间的顺序不做保证,而partial_sort排序后前m个数的子区间是有序的。正因为如此在需要无序的前top k个值时 nth_element相对于partial_sort要更快。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值