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

题目:设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       
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值