【2011统考真题】一个长度为L(L≥1)的升序序列S,处在第「L/2个位置的数称为S的中位数。例如,若序列S1=(11,13,15,17,19),则S1的中位数是15,两个序列的中位数给不1是含它们所有元素的升序序列的中位数。例如,若S2=(2,4,6,8,20),则S1和S2的中位数是11。现在有两个等长升序序列A和B,试设计一个在时间和空间两方面都尽可能高效的算法,找出两个序列A和B的中位数。
int M_Search(int A[],int B[],int n)
{
int l1=0,h1=n-1,m1,l2=0,h2=n-1,m2;
while(l1!=h1||l2!=h2)
{
m1=(l1+h1)/2;
m2=(l2+h2)/2;
if(A[m1]==B[m2])
return A[m1];
if(A[m1]<B[m2])
{
if((l1+h1)%2==0)
l1=m1;
else
l1=m1+1;
h2=m2;
}
else
{
h1=m1;
if((l2+h2)%2==0)
h2=m2;
else
h2=m2+1;
}
}
return A[h1]<B[h2]? A[h1]:A[h2];
}
算法的基本设计思想如下。
分别求两个升序序列A、B的中位数,设为a和b,求序列A、B的中位数过程如下
①若a=b,则a或b即为所求中位数,算法结束
②若a<b,则舍弃序列A中较小的一半,同时舍弃序列B中较大的一半,要求两次舍弃的
长度相等。
③若a>b,则舍弃序列A中较大的一半,同时舍弃序列B中较小的一半,要求两次舍弃的
长度相等。
在保留的两个升序序列中,重复过程①、②、③,直到两个序列中均只含一个元素时为止,
较小者即为所求的中位数