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

问题描述:

现有两个等长的升序序列的序列A,B,试设计一个时间和空间都尽可能高效的算法,找出两个序列的中位数

算法的基本思想是:分别求出两个序列的中位数,即为a b,有下列三种情况
1:a=b;即a 为两个序列的中位数
2:a<b: 则中位数只能出现在a和b之间,在序列A中舍弃a之前的元素的到序列A1,在序列B中舍弃b之后的元素,得到序列B1
3:a>b:则中位数只能出现在b和a之间,在序列a中舍弃A之后的元素得到序列A1,在序列B中舍弃b之前的元素,得到B1;
在A1和B1中分别求出中位数,重复上述过程,得到俩个序列中只有一个元素,则较小者即为所求

输入:

5

1 2 3 5 7

2 4 6 8 10

输出:

4

 

代码:

#include<iostream>

using namespace std;

void median(int a[],int b[],int start1,int end1,int start2,int end2)
{
    if(start1==end1)
    {
        cout<<(a[start1]<b[start2]?a[start1]:b[start2]);
        return;
    }
    int mid1=(start1+end1)/2;
    int mid2=(start2+end2)/2;
    float num1,num2;
    if((start1+end1)%2!=0)//n为偶数
    {
        num1=(a[mid1]+a[mid1+1])/2;
        num2=(b[mid2]+b[mid2+1])/2;
    }
    else
    {
        num1=a[mid1];
        num2=b[mid2];
    }
    
    if(num1==num2)
    {
        cout<<num1;
        return;
    }
    else if(num1<num2)
    {
        if((start1+end1)%2!=0)
        {
            mid1++;
        }
        median(a,b,mid1,end1,start2,mid2);
    }
    else
    {
        if((start1+end1)%2!=0)
        {
            mid2++;
        }
        median(a,b,start1,mid1,mid2,end2);
    }
}
int main()
{
    int n;
    int a[100],b[100];
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
    }
    for(int i=1;i<=n;i++)
    {
        cin>>b[i];
    }
    median(a,b,1,n,1,n);
    return 0;
}
posted @ 2020-05-26 10:22  小小阿飞  阅读(1337)  评论(0编辑  收藏  举报