兩個序列的中位數-減治法


問題描述:

現有兩個等長的升序序列的序列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;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM