问题描述:Let X[1..n] and Y[1..n] be two arrays, each containing n numbers already in sorted order. Give an O(lgn)-time algorithm to find the median of all 2n elements in arrays X and Y.懒得写了,直接复制原问题,意思大概都知道,算法导论练习9.3-8
*算法思想很简单,只是处理边界问题有些麻烦,下面给出主要思想:
1.如果每个数组只有一个元素,显然,中位数是小的那一个
2.如果元素个数大于1,则循环,比较每个数组中间那个数,取较大的一方小的一部分子数组,较小的一方大的一部分子数组,如此循环,直至每个子数组中元素个数为1,此时又回到步骤1了*
C++代码如下:
#include<iostream>
#include<vector>
using std::cout; using std::endl;
using std::vector;
int findMid(const vector<int>& a, const vector<int>& b);
int main() {
vector<int> a = { 13,14,15,16};
vector<int> b = {11,12,13,14};
cout << findMid(a, b) << " is the mid number" << endl;
return 0;
}
int findMid(const vector<int>& a, const vector<int>& b) {
int sa = 0, ea = a.size()-1, sb = 0, eb = b.size()-1;
int mida, midb;
while (sa!=ea&&sb!=eb) {
mida = (sa + ea) / 2;
midb = (sb + eb) / 2;
if (a[mida] < b[midb]) {
if ((sa + ea) % 2 == 0) {
sa = mida;
eb = midb;
}
else {
sa = mida + 1;
eb = midb;
}
}
else if(a[mida]>b[midb]){
if ((sb + eb) % 2 == 0) {
ea = mida;
sb = midb;
}
else {
ea = mida;
sb = midb + 1;
}
}
else return a[mida];
}
return a[sa] < b[sb] ? a[sa] : b[sb];
}
注意:每次划分应该确保两个数组保持有序等长,否则会在边界出错。