有序数组的中位数

1. 如果两个数组是等长的,可以用如下的策略:

// 好像有点问题
// 寻找两个升序数组的中位数
int m_search(int A[], int B[], int n) // n 代表长度
{
    int i1=0, j1=n-1, m1;
    int i2=0, j2=n-1, m2;
    // 分别代表两个数组的左右下标, 以及中位数m下标

    while(i1!=j1 || i2!=j2) {
        m1 = (i1+j1)/2;
        m2 = (i2+j2)/2;
        if(A[m1] == B[m2]) {
            return A[m1];
        }
        if(A[m1] < B[m2]) {
            if((i1+j1)%2==0) { //元素个数为奇数,注意下标从0开始
                i1=m1; // 舍弃A[]的左边,但保留中位数
                j2=m2; // 舍弃b[]的右边,但保留中位数

            } else { // 元素个数为偶数
                i1=m1+1; // 舍弃A[]的左边和中位数
                j2=m2; // 舍弃B[]的右边,但保留中位数
            }
        }
        else{
            if((i1+j1)%2==0) { //元素个数为奇数,注意下标从0开始
                j1=m1; // 舍弃A[]的右边,但保留中位数
                i2=m2; // 舍弃b[]的左边,但保留中位数

            } else { // 元素个数为偶数
                j1=m1+1; // 舍弃A[]的右边,但保留中位数
                i2=m2; // 舍弃B[]的左边和中位数
            }
        }
    }
    // return A[i1] < B[i2] ? A[i1] : B[i2];
    printf("%d %d\n", A[i1], B[i2]);
    return (A[i1]+B[i2]);
}

 

 

2. 如果两个有序数组不是等长的,则要稍微麻烦一些:

 

 

 

*******

posted @ 2020-03-19 16:47  我喜欢旅行  阅读(317)  评论(0编辑  收藏  举报