求两个等长的有序序列的中位数(2011计算机统考试题)

  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 */

 

posted on 2014-01-05 22:07  jjtx  阅读(1291)  评论(0编辑  收藏  举报

导航