給定兩個長度均為 n 的升序整數陣列 A、B,求這 2n 個元素中第 n 大(即中位數)的值。推廣至任意長度 m, n 及任意順位 k。
p = A+n, q = B+n。range = (k+1)/2 步,比較 *p1 與 *q1。range 個元素「不可能」包含答案,直接捨棄,k -= range。k。k ≤ 1,最後在常數時間內決出勝負。int search4n(int *a, int *b, int n) {
int *p=a+n, *q=b+n, range;
if (a[0] > b[n-1]) return a[0];
if (b[0] > a[n-1]) return b[0];
while (n > 1) {
range = (n+1)/2;
int *p1 = p-range, *q1 = q-range;
if (*p1 > *q1) {
n -= range; p = p1; q--;
while (*q > *p1) { q--; n--; }
} else {
n -= range; q = q1; p--;
while (*p > *q1) { p--; n--; }
}
}
return (n==0) ? max(*p,*q) : max(*--p,*--q);
}
增加邊界檢查 p1 > a、q1 > b,並處理其中一陣列耗盡的情況。邏輯同樣以「雙指標對稱收斂」為核心,額外判斷僅在接近邊界時生效。
O(1),僅 4 指標 + 1 整數。O(1)(邊界條件即決);最差介於 O(log n) 到 O(n) 之間。遞迴式 f(n) = 1 + k + f(n - (n+1)/2 - k),k 分布決定平均性能,作者未給出閉式解。O(log n) 更優。此算法展示了「對稱雙指標 + 幂級跨越」的巧思,適合作為面試進階題或教學案例,但在生產環境建議採用標準庫 std::nth_element 或經典二分法以求穩健。