无序数组求中位数

本文探讨了两种求解无序数组中位数的算法:一种是通过建立最小堆,另一种是同时建立最大堆和最小堆。算法1在元素个数为奇数时,通过最小堆确保中位数的正确性;算法2的时间复杂度为O(n)。这些方法在处理大量数据时能有效估算中位数。
摘要由CSDN通过智能技术生成

长度为 n 的无序数组,求中位数,如何尽快的估算出中位数,算法复杂度是多少?

算法 1(建立最小堆):

如果数组中元素有奇数个,可以采用这种算法:
步骤 1 :可以将数组的前 (n+1)//2 个元素,建立 1 个最小堆;
步骤 2 :遍历剩余元素,如果剩余元素小于堆顶元素,则丢弃或不作处理;如果剩余元素大于堆顶元素,则将其取代堆顶元素,并将当前堆调整为最小堆。
步骤 3 :返回堆顶元素,即 nums[0],就是所要寻找的中位数。

一点解释:
不管是步骤 1、2 还是整个过程中,最小堆的栈顶元素必然满足:
中位数 >= 最小堆的堆顶元素
例如,[7,8,9,10,11,12,13] 中位数是 10 ,n 等于 7 ,(n+1)//2 等于 4 ,不管是取前 4 个数、后 4 个数、任意 4 个数,构造的最小堆的堆顶元素,最小为 7 ,最大为 10。
因此,小于堆顶元素的元素,必然不可能是中位数,可以直接丢弃;中位数只有可能在最小堆、剩余元素中。

实现:

# coding:utf-8
#from heap_sort import filter_down


def filter_up(nums, p, n):
        parentIdx = p
        rootVal = nums[parentIdx]

        while 2*parentIdx&
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值