求一个无序数组的中位数

博客介绍了两种在不进行排序的情况下求解无序数组中位数的算法:一种利用堆排序思想,通过构建小顶堆找到中位数;另一种借助快速排序的分治法,选择划分点来定位中位数。这两种方法都避免了完整的排序过程,力求降低时间复杂度。

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

求一个无序数组的中位数,如:{2,5,4,9,3,6,8,7,1}的中位数为5,{2,5,4,9,3,6,8,7,1,0}的中位数为4和5。
要求:不能使用排序,时间复杂度尽可能低。
解决方案一:采用堆排序思想
1、将前(n+1)/2个元素调整为一个小顶堆
2、对后续的每一个元素,和堆顶比较,如果小于等于堆顶,丢弃之,取下一个元素。如果大于堆顶,用该元素取代堆顶,调整堆,取下一元素
3、当遍历完所有元素之后,堆顶即是中位数
建一个小顶堆,需要用到STL里面的 priority_queue,priority_queue 对于基本类型的使用方法相对简单。他的模板声明带有三个参数:

priority_queue<Type, Container, Functional>

其中Type 为数据类型, Container 为保存数据的容器,Functional 为元素比较方式。
Container 必须是用数组实现的容器,比如 vector, deque 但不能用 list.
STL里面默认用的是 vector. 比较方式默认用 operator< , 所以如果你把后面俩个参数缺省的话,优先队列就是大顶堆,队头元素最大。
如果要用到小顶堆,则一般要把模板的三个参数都带进去。
STL里面定义了

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值