有序等长数组求中位数问题

问题描述:Let X[1..n] and Y[1..n] be two arrays, each containing n numbers already in sorted order. Give an O(lgn)-time algorithm to find the median of all 2n elements in arrays X and Y.懒得写了,直接复制原问题,意思大概都知道,算法导论练习9.3-8
*算法思想很简单,只是处理边界问题有些麻烦,下面给出主要思想:
1.如果每个数组只有一个元素,显然,中位数是小的那一个
2.如果元素个数大于1,则循环,比较每个数组中间那个数,取较大的一方小的一部分子数组,较小的一方大的一部分子数组,如此循环,直至每个子数组中元素个数为1,此时又回到步骤1了*
C++代码如下:

#include<iostream>
#include<vector>
using std::cout; using std::endl;
using std::vector;
int findMid(const vector<int>& a, const vector<int>& b);
int main() {
    vector<int> a = { 13,14,15,16};
    vector<int> b = {11,12,13,14};
    cout << findMid(a, b) << " is the mid number" << endl;
    return 0;
}
int findMid(const vector<int>& a, const vector<int>& b) {
    int sa = 0, ea = a.size()-1, sb = 0, eb = b.size()-1;
    int mida, midb;
    while (sa!=ea&&sb!=eb) {
        mida = (sa + ea) / 2;
        midb = (sb + eb) / 2;
        if (a[mida] < b[midb]) {
            if ((sa + ea) % 2 == 0) {
                sa = mida;
                eb = midb;
            }
            else {
                sa = mida + 1;
                eb = midb;
            }
        }
        else if(a[mida]>b[midb]){
            if ((sb + eb) % 2 == 0) {
                ea = mida;
                sb = midb;
            }
            else {
                ea = mida;
                sb = midb + 1;
            }
        }
        else return a[mida];
    }
    return a[sa] < b[sb] ? a[sa] : b[sb];
}

注意:每次划分应该确保两个数组保持有序等长,否则会在边界出错。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值