求兩個等長的已排序數組的中位數(《算法導論》P113習題9.3-8)

      [問題]設X[1...n]和Y[1...n]爲兩個數組,每一個都包含n個已排序好的數。給出一個求數組X和Y中全部2n個元素的中位數的、O(lgn)時間的算法。算法

      [解析]O(lgn)的時間複雜度就是二分查找的複雜度。首先給出一個觀察:若是全部元素的中位數是X,那麼從數組中同時刪除num個小於X的的元素和num個大於X的元素後,產生的新集合的中位數仍是X。考慮以下思路求解:每次比較AB數組的中項元素A[n/2],B[n/2],代碼實現以下:數組

 

int FindMiddleElement(int A[],int B[],int n)  
{  
    if (n == 1)  
    {  
        return A[0] > B[0] ? B[0] : A[0];  
    }  
    
    if (A[n/2] == B[n/2])  
    {  
        return A[n/2];  
    }  
    
    if (A[n/2]>B[n/2])  
  {
      // 須要確保A和B中丟掉相同數量的元素                   
        if (n%2 == 0)    //丟掉B[0...n/2 - 1]和A[n/2...n-1]  
        {
			return FindMiddleElement(A,B + n/2,n/2);
		}
        else    //丟掉B[0...n/2 - 1]和A[n/2 + 1...n-1]  
        {
		    return FindMiddleElement(A,B + n/2,n/2 + 1);  
    }  
    else   
    {
		// 須要確保A和B中丟掉相同數量的元素  
        if (n%2 == 0)    //丟掉A[0...n/2 - 1]和B[n/2...n-1]  
		{
            return FindMiddleElement(A + n/2,B,n/2);
		}
        else    //丟掉A[0...n/2 - 1]和B[n/2 + 1...n-1]   
		{
            return FindMiddleElement(A + n/2,B,n/2 + 1); 
	    }
    }  
}
相關文章
相關標籤/搜索