【2011统考真题】一个长度为L(L≥1)的升序序列S,处在第[L/2个位置的数称为S的中位数。例如,若序列S=(11,13,15,17,19),则S的中位数是15,两个序列的中位数是含它们所有元素的升序序列的中位数。例如,若S1=(2,4,6,8,20),则S和S1的中位数是11。现在有两个等长升序序列A和B,试设计一个在时间和空间两方面都尽可能高效的算法,找出两个序列A和B的中位数。要求:
1)给出算法的基本设计思想。
2)根据设计思想,采用C或C++或Java语言描述算法,关键之处给出注释。3)说明你所设计算法的时间复杂度和空间复杂度。
void test11(SqList l1,SqList l2)//时间复杂度O(n),空间复杂度O(1)
{
int i=0,j=0,mid;
for(int k=0;k<(l1.length+l2.length)/2-1;k++)//直接找到中位数所在位置的那个数
{
if(l1.data[i]>l2.data[j])
j++;
else
i++;
}
if(l1.data[i]<l2.data[j]) //中位数是小的那个
mid=l1.data[i];
else
mid=l2.data[j];
}