/*两个序列的中位数*/
#include<stdio.h>
int SearchMid(int A[], int B[], int n);
main()
{
int A[]={11,13,15,17,19};
int B[]={2,4,10,15,20};
int s=0;
//打印A,B序列
printf("序列A是:");
for(int i=0; i<5; i++)
{
printf("%d ",A[i]);
}
printf("\n序列B是:");
for(int i=0; i<5; i++)
{
printf("%d ",B[i]);
}
s=SearchMid(A,B,5);
printf("\n两个序列的中位数是:%d",s);
}
int SearchMid(int A[], int B[], int n)
{
int s1=0, e1=n-1, s2=0, e2=n-1; //初始化两个序列的上下界
int mid1, mid2;
while(s1<e1 && s2<e2) //循环直到序列A与序列B均只有一个元素
{
mid1=(s1+e1)/2;
mid2=(s2+e2)/2;
if(A[mid1]==B[mid2]) return A[mid1]; //第1种情况
if(A[mid1]<B[mid2])
{
if((s1+e1)%2==0) s1=mid1; //保证两个子序列长度相等,因为是向下取整,所以是较小的s1的中位数向后移
else s1=mid1+1;
e2=mid2;
}
else{
if((s2+e2)%2==0) s2=mid2;
else s2=mid2+1;
e1=mid1;
}
}
if(A[s1]<B[s2]) return A[s1]; //较小者为所求,因为一直在向下取整
else return B[s2];
}
减治法———两个序列的中位数
最新推荐文章于 2023-03-03 09:44:02 发布