C语言关于寻找两个升序数组中位数问题

一个长度为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次实际上是第六个元素),以此还能能出其他位置元素。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值