天天看點

分治法求兩個長度相同都按升序排列數組的中位數

#include <iostream>
using namespace std;
void Mid(int a[],int aleft,int aright,int b[],int bleft,int bright)
{
	double mid;
	int n=aright-aleft+1;
	int k1=(aleft+aright)/2;	
	int k2=(bleft+bright)/2;	
	if(aright-aleft==1&&bright-bleft==1)//兩個數組都隻有兩個元素。可以直接求出中位數
	{		
		cout<<"mid="<<(max(a[aleft], b[bleft]) + min(a[aright], b[bright])) / 2.0<<endl;
		return ;
	}
	if((aleft==aright)&&(bleft==bright))//兩個數組都隻有一個元素
	{
		mid=(a[aleft]+b[bleft])/2.0;
		cout<<"mid="<<mid<<endl;
		return;		
	}
	else//其他情況
	{
			if(a[k1]==b[k2])
			{
				mid=a[k1];
				cout<<"mid="<<mid<<endl;				
			}	
			if(a[k1]<b[k2])
			{
				Mid(a,k1,aright,b,bleft,k2);
			}
			if(a[k1]>b[k2])
			{
				Mid(a,aleft,k1,b,k2,bright);	
			}
	}
}
int main()
{
	int a[]={1, 12, 15, 26, 38};
	int b[]={13, 14, 40, 42, 45};
	Mid(a,0,4,b,0,4);
	system("pause");
}
           

繼續閱讀