两个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];//返回较小者
}