两个等长有序数组求中位数

本文探讨了如何从两个等长有序数组中寻找中位数,指出了一些常见实现中存在的问题。作者强调,中位数可能是同一数组内的两个数字,而不仅仅是来自不同数组的数字。通过二分搜索的思路,给出了迭代结束条件的修正,并提供了相应的C语言实现代码。
摘要由CSDN通过智能技术生成

在网上看了很多两个等长有序数组求中位数的文章,但我都觉得有点儿问题。等下会说我觉得问题在哪里。

先说下中位数定义:当数组元素个数为奇数个的时候,中位数就是中间的数字,比如数组[1,2,3,4,5],那么3就是中位数。如果数组元素个数为偶数个的时候,那么中间两个元素的平均值就是中位数的值,比如数组[1,2,4,5],那么中位数就是(2+4)/2=3.

定义清楚了下面就来说下两个等长数组求中位数的问题,为了简化问题,直接假设两个数组都按从小到大顺序排列好了。两个等长数组,那么总的元素个数肯定为偶数,那么结果就肯定是某两个数字的平均值。

求解方法基本都一样,就是用二分搜索的思路来做。假设有两个数组A,B,首先用两个指针a,b分别指向A,B中间的数字,然后比较这两个数字,假设a指向数字大于b的数字,那么结果肯定不在a指向数字的右边和b指向数字的左边。然后分别向左向右移动a,b两个指针,再次进行比较。就是二分搜索的思路。

然后说问题,在网上看了好多博客,求得的结果都是指针移动的最后结果是A中某一元素和B中某一元素一起作为结果。但我认为这是不对的,因为最终结果的两个数字完全可以在同一个数组中,假设有两个数组

A:1 2 7 9 10
B:3 4 5 6 8
合并后中位数应该是5 和 6,两个数都在数组B中,并不是A、B各一个数。

网上很多人写的迭代结束条件都是找到了a=b或者最后子数组长度都为1,我觉得结束条件应该是找到a=b或者数组长度为2。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值