1.等长序列
题目来源于王道考研数据结构书
一个长度为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,试设计一个在时间和空间两方面都尽可能高效的算法,找出两个序列A和B的中位数。
1.1 O(n) 的解法
就是从头到尾一共数 len 个数,这个时候两个指针指向的数字较小者即为所求
int midNum ( int* a, int* b, int len ) {
int i = 0, j = 0, k = 0;
for ( ; k < len-1; k++ ) {
if ( a[i] < b[j] ) {
i++;
}
else {
j++;
}
}
return (a[i] < b[j])? a[i]: b[j];
}
1.2 O(logn)的解
分别求两个升序序列的 A、B 的中位数 a 和 b,
① 若 a = b, 则已找到两个序列的中位数,返回a
② 若 a < b, 则舍弃序列 A 中较小的一半, 舍弃序列 B 中较大的一半
③ 若 a > b, 则舍弃序列 A 中较大的一半, 舍弃序列 B 中较小的一半 重复过程 ① 到 ③ 直到两个序列均只含一个元素为止,返回较小者
int midNum2 ( int* a, int