关于O(logn)的细节:
奇数保留中位数(反例);
偶数不保留中位数(无限循环);
二分原因,比较厚序列一左侧与序列二右侧由于大小关系可剔除,从而使保留的元素接近中位数,继续二分,剔除通过修改边界下标实现;
两序列每次修改的长度一致,因此两序列都只剩最后一个元素时,必是最中间两元素的左或右位置;
// 两升序序列获得中位数问题
#include <stdio.h>
typedef int Elemtype;
int a[100], b[100];
Elemtype FindMid(Elemtype A[], Elemtype B[], int n) {
int s1 = 0, d1 = n - 1, s2 = 0, d2 = n - 1, m1, m2;
while (s1 != d1 || s2 != d2) {
m1 = (s1 + d1) / 2;
m2 = (s2 + d2) / 2;
if (A[m1] == B[m2]) return A[m1];
if (A[m1] < B[m2]) {
if ((s1 + d1) % 2 == 0) // 奇数情况;
s1 = m1, d2 = m2;
else // 偶数情况;
s1 = m1 + 1, d2 = m2;
}
else {
if ((s1 + d1) % 2 == 0)
s2 = m2, d1 = m1;
else
s2 = m2 + 1, d1 = m1;
}
}
return A[s1] < B[s2] ? A[s1] : B[s2];
} // O(logn)
Elemtype FindMid2(Elemtype A[], Elemtype B[], int n) {
int i = 0, j = 0, k = 0;
while (i < n && j < n) {
if (A[i] < B[j]) {
i ++, k ++;
if (k == n) return A[i - 1];
}
else {
j ++, k ++;
if (k == n) return B[j - 1];
}
}
} // O(n)
int main() {
int n; scanf("%d", &n);
for (int i = 0; i < n; i ++) scanf("%d", &a[i]);
for (int i = 0; i < n; i ++) scanf("%d", &b[i]);
printf("%d", FindMid2(a, b, n));
return 0;
}