查找兩個等長升序線性表的中位數

  • 一個長度爲L(L≥1)的升序序列S,處在第éL/2ù個位置的數稱爲S的中位數。例如,若序列S1=(11, 13, 15, 17, 19),則S1的中位數是15。兩個序列的中位數是含它們全部元素的升序序列的中位數。例如,若S2=(2, 4, 6, 8, 20),則S1和S2的中位數是11。現有兩個等長升序序列A和B,試設計一個在時間和空間兩方面都儘量高效的算法。
  • 思考:若是這些數據已有序排列在一個序列中,則只經過一次下標計算,便可求得中位數。題目中所給的數據分屬於兩個有序序列,其中位數的位置不能再經過簡單計算肯定。該題能夠有多種思路,例如,將兩個有序序列歸併爲一個有序序列後再求其中位數,便可求解。但題目中要求「設計一個在時間和空間兩方面都儘量高效的算法」,這是解題的關鍵。顯然,僅用歸併過程求解不能知足要求。因爲要處理的序列是升序序列,因此該題的處理過程也可借鑑對有序表進行2路歸併的思想,代碼以下:
int M_Search( int A[ ], int B[ ],int n )   
   i = j = k = 0;
   while ( i<n && j<n )
   {    k++;
         if( A[i] < B[j] )
         {     i++;
                if( k==n )
                       returnA[i-1];
         }
         else
         {     j++;
                if( k==n )
                       returnB[j-1];
         }  
   }
}
相關文章
相關標籤/搜索