无聊写排序之 ----部分排序(Partial Sort)

本文探讨了如何在无序序列中快速找出前m个最大元素的问题,介绍了STL中的partial_sort算法。该算法不同于完整的排序,它只确保序列中前middle-first个元素按指定顺序排序并放在序列开头。partial_sort的实现基于堆排序思想,通过建立大顶堆,遍历序列并与堆顶元素比较,从而高效地找到前m个最大元素。相比sort,当m远小于n时,partial_sort具有更高的效率。

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

当有一个无序的序列集合的时候,我们想知道这个序列里面按照某种排序关系最大的m个或者前top个有序的元素。比如我又100个学生,我只想知道排名前20的学生的名次列表,剩余的我并不关心,如何去得到呢? 当然你脑海中第一个闪过的便是sort,做一次排序,取排序后前面的20不就好了吗? 没错,排序作为做常规的方法,肯定是最先想到的,这里要介绍的是比排序来的更快更直接的一个算法:部分排序(partial_sort),该算法来自于STL的算法库,在研究STL源码时看到的,瞬间眼前一亮,这里分享出来。

partial_sort算法接受一个middle的index,该middle位于[first, last)的元素序列范围内,然后重新安排[first, last),使得序列中的middle-first个最小元素以指定顺序排序最终放置在[first, middle)中, 其余的元素安置在[middle, last)内,不保证有任何指定的顺序。因此可以看出来partial_sort执行后并不保证所有的结果都有序,而有序的部分数量永远都小于等于整个元素区间的数量。所以在只是挑出前m个元素的排序中,效率明显要高于全排序的sort算法,当然m越小效率越高,m等于n时相当于全排序了。

partial_sort的原理:部分排序的原型出现在STL的算法库里面,根据其所描述的代码,很容易可以看出来partial_sort是借用了堆排序的思想来作为底层排序实现的。对于该算法的原理这样描述。假设我们有n个元素序列,需要找到其中最小的m个元素,m<=n时。 先界定区间[first, m) 然后对该区间使用make_heap()来组织成一个大顶堆。然后遍历剩余区间[m, last)中的元素, 剩余区间的每个元素均与大顶堆的堆顶元素进行比较(大顶堆的堆顶元素为最大元素,该元素为第一个元素,很容易获得),若堆顶元素较小,边交换堆顶元素和遍历得到的元素值,重新调整该大顶堆以维持该堆为大顶堆。遍历结束后,[first, m)区间内的元素便是排名在前的m个元素,在对该堆做一次堆排序便可得到最好的结果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值