无序数组求中位数——小根堆法原理(附python代码)

本文介绍了如何使用小根堆求解无序数组的中位数,详细解析了步骤和原理,包括堆的建立、元素替换与调整,确保中位数最终位于堆顶。

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

小根堆法:

定义中位数为一个有序数组(len(array)+1)//2处的元素,“//”代表下取整。我知道中位数的定义分按照数组长度的奇偶性分两种,但是面试官会告诉你这里求的中位数就是有序数组(len(array)+1)//2处的元素。
如:
1 2 3 4 5 6 7 8 9 的中位数是(9+1)//2 = 5
1 2 3 4 5 6 7 8 9 10 的中位数是(10+1)//2=5
现在来求无序数组的中位数:
步骤 1 :如果数组长度为奇数则取数组的前 (len(array)+1)//2 个元素建立 一个最小堆,如果为偶数则取(len(array)+1)//2 +1个元素建立 一个最小堆。
步骤 2 :遍历剩余元素,如果该元素小于堆顶元素,则丢弃或不作处理;如果该元素大于堆顶元素,则将其取代堆顶元素,并且重新调整当前堆为最小堆。
步骤 3 :遍历结束后,返回堆顶元素,它就是所要寻找的中位数。
原理:
(建立大根堆也是行得通,这里选小根堆来解释)
这里假设数组长度为奇数,步骤1中说是从前往后取(len(array)+1)//2 个元素建立 一个最小堆,其实任意取(len(array)+1)//2 个元素都可以,所取的这(len(array)+1)//2 个元素有两种可能的情况。
情况1:这(len(array)+1)//2 个元素中包含了中位数。
情况2:这(len(array)+1)//2 个元素没有包含中位数。
对于情况1:
中位数可能位于堆顶或者堆内部。
(1)当中位数位于堆顶的时候,因为是小根堆,所以数组内所有比中位数大的元素都在小根堆内,此时遍历数组剩余元素,根本不可能找到比堆顶大的元素,所以遍历完数组剩余元素堆顶保持不变。
如1 2 3 4 5 6 7 8 9 任取(9+1)//2=5个元素建立小根堆,如果5是堆顶,那堆内的其余元素只能是6 7 8 9了。遍历剩余元素1 2 3 4 ,堆顶保持不变。
(2)当中位数位于堆内的时候,堆顶元素比中位数小,则数组剩余元素中必然含有比中位数大的元素。如果用数组剩余元素中比堆顶小的来替换堆顶,那小根堆根本不用调整,这谁顶得

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值