求两个相同大小已排序数组中的中位数

int findnth(int* a,int* b,int l1,int r1,int l2,int r2)
{
  int t1,t2;
  int result;
  int nth=r1-l1+1;
  int middle=(nth+1)/2;
  if(nth==1||a[middle-1+l1]==b[middle-1+l2])
   return a[middle-1+l1]<=b[middle-1+l2]?a[middle-1+l1]:b[middle-1+l2];
  if(a[middle-1+l1]<b[middle-1+l2])
  {
    if(nth%2==0)
    {
      t1=middle+l1,t2=middle-1+l2;
    }
    else
    {
      t1=middle-1+l1,t2=middle-1+l2;
    }
    result=findnth(a,b,t1,r1,l2,t2);
  }
  else
  {
    if(nth%2==0)
    {
      t1=middle-1+l1,t2=middle+l2;
    }
    else
    {
      t1=middle-1+l1,t2=middle-1+l2;
    }
    result=findnth(a,b,l1,t1,t2,r2);
  }
   return result;
}
    先求第N小的数,第N大的数刚好排在它前面。 
   首先,比较A的中位数和B的中位数,不妨设A[n/2]> B[n/2],则所求必在A[1...n/2]和B[n/2...n]之中。再比较后面两个数组的中位数,以此迭代,每次查找范围缩小一半,故运行时间O(logN).
    举例:A={1,2,3,6,7},B={0,4,5,8,9}
第一次比较3和5,得到下一次查找范围{3,6,7}和{0,4,5}
第二次比较6和4,得到{3,6}和{4,5}
第三次比较3和4,得到{6}和{4}
    最后检查6和4对应的下标,可以确定是4.
    因此第N大的数应是5和6中较小的一个,即所求为5。
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值