1 /******************************************************************** 2 created: 2014/01/05 3 created: 22:01 4 file base: main 5 file ext: cpp 6 author: Justme0 (http://blog.csdn.net/Justme0) 7 8 purpose: 求兩個等長的有序序列的中位數,時間複雜度O(log(n)) 9 *********************************************************************/ 10 11 #define _CRT_SECURE_NO_WARNINGS 12 #include <iostream> 13 #include <vector> 14 #include <cassert> 15 #include <algorithm> 16 using namespace std; 17 18 template <class Iterator> 19 Iterator search_middle(Iterator begin1, Iterator end1, Iterator begin2) { 20 while (begin1 + 1 != end1) { 21 int len = end1 - begin1; 22 int m = (len - 1) / 2; // m 是中位數的下標 23 bool is_odd = (len % 2 == 1); 24 25 if (begin1[m] < begin2[m]) { 26 if (is_odd) { 27 begin1 += m; 28 } else { 29 begin1 += m + 1; 30 } 31 } else if (begin2[m] < begin1[m]) { 32 if (is_odd) { 33 begin2 += m; 34 end1 -= m; 35 } else { 36 begin2 += m + 1; 37 end1 -= m + 1; 38 } 39 } else { 40 return begin1 + m; 41 } 42 } 43 44 return *begin1 < *begin2 ? begin1 : begin2; 45 } 46 47 void input(vector<int> &v, int len) { 48 for (int i = 0; i < len; ++i) { 49 int elem; 50 cin >> elem; 51 v.push_back(elem); 52 } 53 } 54 55 void output(vector<int> &v) { 56 for (vector<int>::iterator it = v.begin(); it != v.end(); ++it) { 57 cout << *it << " "; 58 } 59 cout << endl; 60 } 61 62 int main(int argc, char **argv) { 63 freopen("cin.txt", "r", stdin); 64 65 int len; 66 while (cin >> len) { 67 vector<int> v1, v2; 68 input(v1, len); 69 input(v2, len); 70 71 vector<int> v3(v1.size() * 2); 72 merge(v1.begin(), v1.end(), v2.begin(), v2.end(), v3.begin()); 73 int b = v3[(v3.size() - 1) / 2]; 74 75 int a = *search_middle(v1.begin(), v1.end(), v2.begin()); 76 assert(a == b); 77 cout << a << " " << b << endl; 78 if(a != b) { 79 output(v3); 80 cout << "a=" << a << endl; 81 cout << "b=" << b << endl; 82 } 83 } 84 85 return 0; 86 } 87 88 /* cin.txt 89 1 90 1 91 0 92 93 1 94 -3 95 3 96 97 2 98 1 2 99 2 3 100 101 3 102 0 5 6 103 2 2 2 104 105 4 106 1 2 3 4 107 6 7 8 9 108 109 4 110 1 2 6 7 111 3 4 5 6 112 113 5 114 12 22 222 333 3333 115 10 13 44 55 66 116 117 10 118 3 3 22 34 44 333 2222 11111 11112 11113 119 -5 -4 0 1 444 4444 44444 44445 444444 444445 120 */