2011年计算机联考真题——寻找2个序列的中位数

来源:互联网 发布:互动投影软件下载 编辑:程序博客网 时间:2024/06/03 08:26

这里写图片描述


思路:
设定两个升序序列分别为A与B,中位数分别为a和b。
1)如a=b,则即为所求,算法结束。
2)当a< b时,抛弃A的较小的一般和B的较大的一半,并且舍弃的长度必须相等。
3)当 a > b时,抛弃A的较大的一般和B的较小的一半,并且舍弃的长度必须相等。
重复复进行1,2,3过程,知道两个序列均只含一个元素为止,较小者即为所求。



代码如下:

#include <iostream>using namespace std;int Median(int* A,int* B,int n){    int s1 = 0 , d1 = n-1, m1 = 0;    int s2 = 0 , d2 = n-1, m2 = 0;    while(s1 != d1 || s2 != d2){        m1 = (s1+d1) / 2;        m2 = (s2+d2) / 2;        if(A[m1] == B[m2]){            return A[m1];        }        if(A[m1] < B[m2]){            if((s1+d1)%2 == 0){                s1 = m1;                d2 = m2;            }else{                s1 = m1+1;                d2 = m2;            }        }else{            if((s2+d2)%2 == 0){                d1 = m1;                s2 = m2;            }else{                d1 = m1;                s2 = m2+1;            }        }    }    return (A[s1]<B[s2])?A[s1]:B[s2]; }void Print(int* A,int n){    for(int i = 0 ; i < n ; i++){        cout<<A[i]<<" ";    } }int main(){    int A[5] = {11,13,15,17,19};    int B[5] = {2,4,6,8,20};    cout<<"第一个数组为:"<<endl;    Print(A,5);    cout<<endl;    cout<<"第二个数组为:"<<endl;    Print(B,5);    cout<<endl;    cout<<"中位数为:";    int median = Median(A,B,5);    cout<<median<<endl;    return 0;}

截图:
这里写图片描述

原创粉丝点击