算法导论练习9.3-8 中位数

博客讨论了如何在O(logn)时间内找到两个已排序数组X和Y(各含n个元素)的中位数。初始解法使用分治策略,先分别找出两个数组的中位数,然后根据它们的相对大小逐步缩小规模。然而,该方法在数组元素为偶数时存在问题,可能导致错误的中位数。修正的算法确保在偶数元素情况下,始终在一个数组中取上中位数,另一个取下中位数,最终通过快速排序验证了正确性。

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

题目:设X[1..n]和Y[1..n]为两个数组,每个都包含n个已排好序的数。给出一个求数组X和Y中所有2n个元素的中位数的、O(logn)时间的算法。

 

这题是老师布置的作业,一开始我想出的解法如下:

分治法:

1、先分别求出X和Y的中位数

2、比较两个数的大小,如果相等就返回。如果不等的话,去掉较大中位数所在的那个数组的较大的一半,去掉较小的中位数所在的数组的较小的一半

3、在规模减半的两个数组上递归调用。

4、如果一直没有遇到正好相等的情况,那么递归到最后会剩下四个数,则返回第二个数。因为这两个数组都是有n个元素,所以最终返回的必然是2n个数中的下中位数。

 

写了一个程序如下:

 

01 int search( int [] X , int p , int q ,
02        int [] Y , int r , int s) {
03     int midx , midy;
04     if ((p + 1 == q) && ( r + 1 == s)) {
05         if ( X [p ] < Y [ r ])
06             return ( X [ q ] < Y [ r ]) ? X [ q ] : Y [ r ];
07         else
08        return ( Y [s ] < X [p ]) ? Y [s ] : X [p ];
09     }
10     else {
11         midx = (p + q) / 2;
12         midy = ( r + s) / 2;
13         if ( X [ midx ] < Y [ midy ])
14             return search( X , midx , q , Y , r , midy);
15         else if ( X [ midx ] > Y [ midy ])
16        return search( X , p , midx , Y , midy , s);
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值