2011年数据结构大题

 答案代码:

#include <stdio.h>
int MidSearch(int A[], int B[], int n) {
//分别表示序列 A 和 B 的首位数、末位数和中位数,s 是 start 简写,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)
if (A[m1] < B[m2]) { //满足条件 2)
 
 
if ((s1 + d1) % 2 == 0) { //若元素个数为奇数,这里注意数组下标从 0 开始
s1 = m1; //舍弃 A 中间点以前的部分且保留中间点
d2 = m2; //舍弃 B 中间点以后的部分且保留中间点
}
else { //元素个数为偶数
s1 = m1 + 1; //舍弃 A 中间点及中间点以前部分,我们举一个例子告诉大家必须
加 1
d2 = m2; //舍弃 B 中间点以后部分且保留中间点
}
}
else { //满足条件 3),下面的操作和上面条件 2 是完全对称的
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};//我们也可以分别把 A 和 B 都变为偶数个元素来测试
int B[] = { 2,4,6,8,20};
int mid = MidSearch(A, B, 5);
printf("mid=%d\n", mid);
return 0;
}
 
我的代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

typedef struct list{
int *p;
int len;
}S;

int FindMiddle(int *array1,int *array2,int n){
static int end1,end2,start1,start2,mid1,mid2;
end1 = n-1;
start1 = 0;
start2 = 0;
end2 = n-1;
while(start1!=end1){
mid1 = (start1+end1)/2;
mid2 = (start2+end2)/2;
if(array1[mid1]==array2[mid2]){
return array1[mid1];
}
if(end1-start1 % 2 == 0){//如果数组是奇数
if(array1[mid1]>array2[mid2]){
end1 = mid1;;
start2 = mid2;
}
else{
start1 = mid1;
end2 = mid2;
}
}else{//如果数组是偶数
if(array1[mid1]>array2[mid2]){
end1 = mid1;
start2 = mid2+1;
}else{
start1 = mid1+1;
end2 = mid2;
}
}

}
return array1[mid1];

}

int main(){
int array1[] = {11,13,15,17,19};
int array2[] = {2,4,6,8,20};
int mid = 0;
mid = FindMiddle(array1,array2,5);
printf("mid=%d\n",mid);


return 0;
}
posted @ 2023-08-24 10:40  00紫  阅读(54)  评论(0)    收藏  举报