一个长度为L(L≥1)的升序序列S,处在第[L/2]个位置的数称为 S的中位数。例如,若序列S=(11,13,15,17,19),则S的中位数是15,两个序列的中位数是含它们所有元素的升序序列的中位数。例如,若S=(2,4,6,8,20),则S和S,的中位数是 11。现在有两个等长升序序列A和B,试设计一个在时间和空间两方面都尽可能高效的算法,找出两个序列A和B的中位数。
两种方法:
1.① 若a=b,则a或b即为所求中位数,算法结束。② 若α<b,则舍弃序列 A中较小的一半,同时舍弃序列 B中较大的一半,要求两次舍弃的长度相等。
③ 若a>b,则舍弃序列 A中较大的一半,同时舍弃序列 B中较小的一半,要求两次舍弃的长度相等。
在保留的两个升序序列中,重复过程①、②、③,直到两个序列中均只含一个元素时为止较小者即为所求的中位数。
int P_20_11(){
int mids1,mids2;
int i=0;
int j=0;
int s1=4;
int s2=4;
int S1[5]={11,13,15,17,19};
int S2[5]={2,4,6,8,20};
while(i!=s1 || j!=s2){
mids1=(i+s1)/2;
mids2=(j+s2)/2;
if(S1[mids1]==S2[mids2]){
return S1[mids1];
}else if(S1[mids1]<S2[mids2]){
if((i+s1)%2==0){
i=mids1;
s2=mids2;
}else{
i=mids1+1;
s2=mids2;
}
}else {
if((i+s1)%2==0){
s1=mids1;
j=mids2;
}else{
s1=mids1+1;
j=mids2+1;
}
}
}
return S1[s1]<S2[s2]?S1[s1]: S2[s2];
}
第二种思路:
由于两个数组都是升序的,可以通过比较大小的方式不断比较,得出想要位置的元素
int P20_11(){
int S1[5]={11,13,15,17,19};
int S2[5]={2,4,6,12,16};
int i=0;
int j=0;
for (int x=0;x<5;x++){
if(S1[i]>S2[j]){
j++;
}else{
i++;
}
}
return S1[i]<S2[j]?S1[i]: S2[j];
}
每次比较就能确定一个元素位置,比较次数就是得出元素的实际位置(下标从0开始,也就是说,比较5次实际上是第六个元素),以此还能能出其他位置元素。

2015

被折叠的 条评论
为什么被折叠?



