2011数据结构真题

2011数据结构真题


 

思路:

设定两个升序序列分别为A与B,中位数分别为a和b。

1)若a = b,则a或b即为所求中位数,算法结束。

2)若a<b,则舍弃序列A中较小的一半,同时舍弃序列A中较小的一半,同时舍弃序列B中较大的一半,要求两此舍弃的长度相等。

3)若a > b,则舍弃序列A中较大的一半,同时舍弃序列A中较大的一半,同时舍弃序列B中较小的一半,要求两次舍弃的长度相等。

在保留的两个升序序列中,重复过程1,2,3,直到两个序列中均含有一个元素时为止,较小者即为所求的中位数。


 

代码如下:

 1 #include<iostream>
 2 
 3 int M_Search(int A[], int B[], int n) {
 4     int s1 = 0, s2 = 0, d1 = n - 1, d2 = n - 1, m1, m2;  //首位数,末位数,中位数
 5     while (s1 != d1 || s2 != d2) {
 6         m1 = (s1 + d1) / 2;
 7         m2 = (s2 + d2) / 2;
 8         if (A[m1] == B[m2]) {
 9             return A[m1];
10         }
11         else if (A[m1] < B[m2]) {
12             if ((m1 + d1) % 2 == 0) {
13                 s1 = m1;
14                 d2 = m2;
15             }
16             else {
17                 s1 = m1 + 1;
18                 d2 = m2;
19             }
20         }
21         else {
22             if ((s2 + d2) % 2 == 0) {
23                 d1 = m1;
24                 s2 = m2;
25             }
26             else {
27                 d1 = m1;
28                 s2 = m2 + 1;
29             }
30 
31         }
32     }
33     return A[s1] < A[s2] ? A[s1] : B[s2];
34 }
35 int main() {
36     int A[6] = { 2,4,6,8,10,12 };
37     int B[6] = { 1,3,5,7,9,11 };
38     int mid = M_Search(A, B, 6);
39     std::cout << mid << std::endl;
40 }

 



 

上一篇:npm 镜像源替换为淘宝镜像


下一篇:H5C3--语义标签以及语义标签IE8兼容,表单元素新属性,度量器,自定义属性,dataList,网络监听,文件读取