减治法-两个序列的中位数

来源:互联网 发布:matlab solve 数组 编辑:程序博客网 时间:2024/06/06 05:04

问题描述:
输入:两个长度为n的有序序列A和B
输出:序列A和B的中位数
分析:
(1)求出两个序列的中位数a和b;
(2)比较a和b,有下面三种情况;
2.1 : a == b 输出a或b,算法结束;
2.2 : a < b 则中位数在a~b之间,所以舍弃A中a之前的数得到序列A1,舍弃B中b之后的数得到序列B1。
2.3 : a>b 则中位数在b~a之间,所以舍弃A中a之后的数得到序列A1,舍弃B中b之前的数得到序列B1。
注意:
在求解过程中一定要保证两个序列中的元素个数相等!!!!。避免其中某个序列先达到中有一个元素的情况。下面代码请仔细思考。

if((s1+e1)%2 == 0)    s1 = mid1;else    s1 = mid1+1;

代码:

#include <iostream>using namespace std;int MidNum(int a[],int b[],int n);int main(){    int a[100],b[100];    int n,i;    cin>>n;    for(i=0;i<n;i++)        cin>>a[i];    for(i=0;i<n;i++)        cin>>b[i];    cout<<MidNum(a,b,n)<<endl;;    return 0;}int MidNum(int a[],int b[],int n){    int s1,e1,s2,e2,mid1,mid2;    s1=0;s2=0;e1=n-1;e2=n-1;    while(s1<e1 && s2<e2)    {        mid1 = (s1+e1)/2;        mid2 = (s2+e2)/2;        if(a[mid1] == b[mid2])            return a[mid1];        if(a[mid1] < b[mid2])        {            if((s1+e1)%2 == 0)                s1 = mid1;            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];}
1 0