利用分治法来求两个排序数组的中位数

有两个数组 ar1[] 和ar2[] 两个数组的长度都为n
求ar1[]和ar2[]的中位数
可以借鉴归并排序的思想 实质上就是将将两个已经排好序的数组 合并成一个数组 的过程只是在这个过程中添加了一个计算从小到大的次序的数
(count ) 当count =n 和n+1时记录下这两个数 然后在这两个数中间取平均值 就可以了 但是这个算法的复杂度是o(n)

如果我们想达到log(n)的复杂度的话 则可以用分治法来实现

求出 ar1[]的中位数 m1 ar2[]的中位数 m2
1.如果m1==m2 则返回m1就可以了
2.如果m1>m2 则取ar1[]中的前半部分和 m2中的后半部分 作为新的数组
3.如果m1

int median(int arr[], int n)
{
    if (n%2 == 0)
        return (arr[n/2] + arr[n/2-1])/2;
    else
        return arr[n/2];
}

int getMedian(int ar1[], int ar2[], int n) {
    int m1;
    int m2;
    if (n <= 0)
        return -1;
    if (n == 1)
        return (ar1[0] + ar2[0]) / 2;

    if (n == 2)
        return (max(ar1[0], ar2[0]) + min(ar1[1], ar2[1])) / 2;

    m1 = median(ar1, n);
    m2 = median(ar2, n);
    /* 相等可直接返回 */
    if (m1 == m2)
        return m1;
    if (m1 < m2) {
        if (n % 2 == 0)
            return getMedian(ar1 + n/2-1, ar2, n/2 + 1);
        else
            return getMedian(ar1 + n/2, ar2, n/2+1);
    } else {
        if (n % 2 == 0)
            return getMedian(ar2 + n/2-1, ar1, n/2+1);
        else
            return getMedian(ar2 + n/2, ar1, n/2+1);
    }
}

int main()
{
    int ar1[] = {1, 12, 10, 26, 38};
    int ar2[] = {2, 13, 17, 30, 45};

    int n1 = sizeof(ar1)/sizeof(ar1[0]);
    int n2 = sizeof(ar2)/sizeof(ar2[0]);
    if (n1 == n2)
        printf("Median is %d", getMedian(ar1, ar2, n1));
    else
        printf("Doesn't work for arrays of unequal size");
    return 0;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hebastast

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值