#include <stdio.h>
int MidSearch(int *A,int *B,int n)
{
//分别表示序列A到序列B的首位元素,末位数和中位数。s是star简写,d是end简写
int s1=0,d1=n-1,m1,s2=0,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];//满足条件1
}else if(A[m1]<B[m2])//满足条件2
{
if((s1+d1)%2==0){//若元素个数为奇数,这里注意组数下标从0开始 五个元素其下标最大就是4
s1=m1;
d2=m2;//夹逼准则
}else{//元素个数为偶数
s1=m1+1;//舍弃A中间点及以前部分
d2=m2;
}
} else{//满足条件3)下面的操作和上面的操作2是完全对称的A[m1]>B[m2]
if((s1+d1)%2==0){//元素个数为奇数,
d1=m1;//舍弃A中间点及以后部分
s2=m2;//舍弃B中间点及以前部分
}else {//元素个数为偶数,
d1 = m1;//舍弃A中间点及以后部分
s2 = m2 + 1;//舍弃B中间点及以前部分
}
}
}
return A[s1]<B[s2] ? A[s1] : B[s2];//因为题目要的是11 所以拿小的那个
}
int main()
{
int A[]={11,13,15,17,19};
int B[]={2,4,6,8,20};
int mid= MidSearch(A,B,5);
printf("mid=%d\n",mid);
return 0;
}
考研408 2011年 第42题 (数据结构——队列)
最新推荐文章于 2024-06-17 17:45:50 发布