[問題]設X[1...n]和Y[1...n]爲兩個數組,每一個都包含n個已排序好的數。給出一個求數組X和Y中全部2n個元素的中位數的、O(lgn)時間的算法。算法
[解析]O(lgn)的時間複雜度就是二分查找的複雜度。首先給出一個觀察:若是全部元素的中位數是X,那麼從數組中同時刪除num個小於X的的元素和num個大於X的元素後,產生的新集合的中位數仍是X。考慮以下思路求解:每次比較A,B數組的中項元素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); } } }