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