两个序列的中位数-减治法
问题描述:
现有两个等长的升序序列的序列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; }