中位数

两个n个元素的升序数组A[n],B[n],求这两个数组合并后的升序数组的中位数。

问题分析;

设A[n]的中位数为a,B[n]的中位数为b。

若a=b,则中位数a或b;

若a<b,则删除a前面的元素和b后面的元素,要求两个数组剩余的元素个数相同。

若a>b,则删除a后面的元素和b前面的元素,要求两个数组剩余的元素个数相同。

直到两个数组都只剩一个元素,则较小的为中位数。

由于要求元素个数相等所以要分为奇数和偶数两个情况。

代码如下:

int M_Search(int A[],int B[],n){
    int s1=0,d1=n-1,m1,s2=1,d2=n-1,m2;
while(s1!=d1&&s2!=d2) {
          m1=(s1+d1)/2;
          m2=(s2+d2)/2;
          if(A[m1]==B[m2])
            return A[m1];
          if(A[m1]<B[m2]){
          if((s1+d1)%2==0){        //由于要使删除后的元素个数相同,所以要分奇偶两种情况。 
 s1=m1;
 d2=m2;
 }
else{
 s1=m1+1;
 d2=m2;  
}
 }
 else{
  if((s1+d1)%2==0){
  d1=m1;
  s2=m2;
 }
else{
  d1=m1;
  s2=m2+1;
 }
 }
}
return A[s1]<B[s2]?A[s1]:B[s2];//返回较小者 
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值