/*一个长度为L(L>=1)的升序序列S,处在第L/2(向上取整)个位置的数称为S的中位数。例如,若
序列S1=(11,13,15,17,19),则S1的中位数是15,两个序列的中位数是含它们所有元素的升序序列
的中位数。例如,若S2=(2,4,6,8,20),则S1和S2的中位数是11。现在有两个等长升序序列A和B,
试设计一个在时间和空间两方面都尽可能高效的算法,找出两个序列A和B的中位数*/
#include<stdio.h>
#include<stdlib.h>
#define InitSize 10
typedef int ElemType;
typedef struct{
ElemType *data;
int length;
}SqList;
bool InitList(SqList &L)
{
L.data = (ElemType*)malloc(sizeof(ElemType)*InitSize);
L.length = 0;
return true;
}
ElemType findCenterVal(SqList S1,SqList S2)
{
int s1=0,d1=S1.length-1,mid1,s2=0,d2=S2.length-1,mid2;
while(s1!=d1 && s2!=d2)
{
mid1 = (s1+d1)/2;
mid2 = (s2+d2)/2;
if(S1.data[mid1] == S2.data[mid2])
return S1.data[mid1];
if(S1.data[mid1]<S2.data[mid2])
{
if((s1+d1)%2==0) //个数为奇数
{
//舍掉s1前面的部分以及s2后面的部分,都包含中间值
s1 = mid1;
d2 = mid2;
}
else
{
//舍掉s2后面的部分(不包含中间值),舍掉s1前面的部分(包含中间值)
s1 = mid1+1;
d2 = mid2;
}
}
if(S2.data[mid2]<S1.data[mid1])
{
if((s2+d2)%2==0) //个数为奇数
{
//舍掉s2前面的部分以及s1后面的部分,都包含中间值
s2 = mid2;
d1 = mid1;
}
else
{
//舍掉s1后面的部分(不包含中间值),舍掉s2前面的部分(包含中间值)
s2 = mid2+1;
d1 = mid1;
}
}
}
return S1.data[s1]<S2.data[s2]?S1.data[s1]:S2.data[s2];
}
bool printList(SqList L)
{
for(int i=0;i<L.length;++i)
printf("%d ",L.data[i]);
printf("\n");
return true;
}
void main()
{
ElemType centerVal;
SqList S1,S2;
InitList(S1);
InitList(S2);
int a[5] = {11,13,15,17,19};
int b[5] = {2,4,6,8,20};
for(int i=0;i<5;++i)
{
S1.data[i] = a[i];
++S1.length;
S2.data[i] = b[i];
++S2.length;
}
printList(S1);
printList(S2);
centerVal = findCenterVal(S1,S2);
printf("%d\n",centerVal);
}
求两个序列的共同中位数
最新推荐文章于 2021-12-21 10:55:49 发布