无序数组中位数

1. 排序

对无序数组排序,然后可以直接得到该数组的中位数,时间复杂度为O(nlogn)。

2. 利用快排思想寻找第K大的数(时间复杂度为O(n))

先挑选一个数作为标准,以该元素为支点,将数组划分为两部分。

这个问题可以抽象化为寻找第K大的数,快排每排完一轮之后左侧都是比他小的元素,右侧都是比他大的元素,那么支点的index(假设为N-1)即为第N大的数。当N == K,我们就找到了第K大的数;当N > K时, 第K大的数在[0,N-1]范围内;当N < K时,第K大的数在[N+1,n-1] (n为数组长度)范围内,利用递归即可找到第K大的数。

具体到寻找中位数,可分为两种情况:如果数组长度为奇数,即为寻找第(n+1)/2大的数;如果为偶数,则为分别寻找第(n/2+1)和第(n/2)大的数,然后求其平均值。

3. 最小堆(时间复杂度为O(nlog(k)))

这个问题可以延伸至求数组的第K小的数。

  1. 取n/2+1个数建堆,将数组中剩余项与堆顶项进行比较,如果比堆顶项小,则直接丢弃;如果比堆顶项大,则入堆,然后重新调整堆的结构,更新堆顶元素,并推出堆中最小的数。
  2. 如果数组长度为奇数,堆顶项即为中位数;如果数组长度为偶数,则中位数为堆顶项以及推出第一个堆顶项之后的数平均。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值