分治法求两个等长升序序列的联合中位数

#include<iostream>
#include<fstream> 
#include<stdlib.h>
using namespace std;


bool judge(int n) {//判断整数奇偶 偶数返回true 
    if(n % 2 == 0) return true;
    else return false;
}

double getAMid(int a[], int x, int y) {//求一个数组的中位数 
    if (judge(y - x + 1))//a查询个数为偶数

        return   (a[(y + x) / 2] + a[(y + x) / 2 + 1]) / 2.0;//求a中位数 

    else

        return  a[(y + x) / 2];
}

int find(int a[], int b[], int a1, int a2, int b1, int b2) {
    double az, bz;//用于记录数组a和b的中位数 
    int ap, bp;
    ap = (a2 +a1) / 2;
    bp = (b2 +b1) / 2;
    az = getAMid(a, a1, a2);
    bz = getAMid(b, b1, b2);

    if (az == bz)return az;

    if (a1 == a2 && b1 == b2)return (a[a1] + b[b1]) / 2.0;

    if (az > bz) {//舍弃az后的数与bz前的数 
        if ((a2 - a1 + 1) % 2 == 0)//为偶数 
            find(a, b, a1, ap, bp + 1, b2);
        else
            find(a, b, a1, ap, bp, b2);
    }

    if (az < bz) {//舍弃az前的数与bz后的数 
        if ((a2 - a1 + 1) % 2 == 0)
            find(a, b, ap+1, a2, b1, bp);
        else
            find(a, b, ap, a2, b1, bp);
    }


}

int main() {

    ifstream in("test.txt");
    if (!in.is_open()) {
        cout << "failed to open file.";
        exit(1);
    }
    int n;//数组大小
    in >> n;
    int a[3], b[3];//建立数组 
    for (int i = 0; i<n; i++) {
        in >> a[i];
    }
    for (int i = 0; i<n; i++) {
        in >> b[i];
    }

    double ans = find(a, b, 0, n - 1, 0, n - 1);

    cout << ans << endl;

    return 0;
}

 

posted @ 2019-03-11 21:00  Kiss_the_rain  阅读(514)  评论(0编辑  收藏  举报