1. 程式人生 > >找兩個排序陣列的中位數

找兩個排序陣列的中位數

題目:給定兩個排序的陣列a,b,長度分別為m和n,找出這兩個陣列的中位數。時間複雜度為O(log(m+n))。

比如:a=[1,2,3,4],b=[2,3,4,]中位數為3。

假定a,b長度分別大於k,現在選擇第k個數(排序後的第k個),先將a的第k/2個元素(a[k/2-1]和b的第k/2個元素(b[k/2-1]比較,存在以下三種情況:

a[k/2-1]==b[k/2-1],第k個數找到了,就是a[k/2-1]或b[k/2-1]

a[k/2-1]>b[k/2-1],第k個數肯定不在b[0...k/2-1],刪除這一段

a[k/2-1]<b[k/2-1],第k個數肯定不在a[0...k/2-1],刪除這一段

int mid(int a[],int b[],int m,int n,int k) //假定m<=n
{
	if(m>n)  //若不是m<=n,調換一下  
		return mid(b,a,n,m,k);
	if(m==0)
		return b[k-1];
	if(k==1)
		return Min(a[0],b[0]);

	int ia=Min(k/2,m);
	int ib=k-ia;
	if(a[ia]==b[ib])  //第k個數找到
		return a[ia];
	if(a[ia]>b[ib])   //第k個數肯定不在b[0..ib],所以,刪除這些,找第k-ib個數
		return mid(a,b+ib,m,n-ib,k-ib);
	else  //a[ia]<b[ib] 第k個數肯定不在a[0...ia],所以,刪除這些,找k-ia個數
		return mid(a+ia,b,m-ia,n,k-ia);
}
	
int Mid(int a[],int b[],int m,int n)
{
	int k=(m+n)/2;
	return mid(a,b,m,n,k);
}