CG算法:寻找两个正序数组中位数(分治法)

在这里插入图片描述

/*
    分治法
    【问题描述】给定两个大小为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的中位数。
    【输入形式】三行,第一行是两个数组的大小,第二行是第一个数组元素,第二行是第二个数组元素
    【输出形式】两个正序数组的中位数,两个数组如果是都是偶数,则返回位置元素,元素下标从0开始,[]表示向下取整
    【样例输入】

     2 2

     1 2

      3 4

   【样例输出】

    2
    【样例说明】 中位数为2

*/
#include <iostream>

using namespace std;

void bubble_sort(int len_x, int len_y, int *arr_x, int *arr_y)
{

    //cout << "bubble_sort" << endl;
    //数组连接
    int len = len_x + len_y;
    int arr[len];
    for (int i = 0; i < len_x; i++)
    {
        arr[i] = arr_x[i];
    }

    for (int i = len_x; i < len; i++)
    {
        arr[i] = arr_y[i - len_x];
    }

    //外圈循环,总共进行size-1次
    for (int i = 0; i < len - 1; i++)
    {

        //内圈循环,每次进行size-i-1次
        for (int j = 0; j < len - i - 1; j++)
        {
            if (arr[j] > arr[j + 1])
            {
                int temp = arr[j + 1];
                arr[j + 1] = arr[j];
                arr[j] = temp;
            }
        }
    }

    // for (int i = 0; i < len; i++)
    // {
    //     cout << arr[i];
    // }

    if (len % 2 == 1)
    {
        cout << arr[(int)(len / 2)];
    }

    if (len % 2 == 0)
    {
        cout << arr[(int)(len / 2) - 1];
    }
}

int main(int argc, char const *argv[])
{
    int len_x, len_y;

    //cout << "len_x,len_y" << endl;
    cin >> len_x;
    cin >> len_y;

    int arr_x[len_x], arr_y[len_y];

    //cout << "arr_x,arr_y" << endl;
    for (int i = 0; i < len_x; i++)
    {
        cin >> arr_x[i];
    }

    for (int i = 0; i < len_y; i++)
    {
        cin >> arr_y[i];
    }

    bubble_sort(len_x, len_y, arr_x, arr_y);

    return 0;
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用分治法求解两个有序数组中位数的伪代码: ``` // 函数:findMedianSortedArrays // 参数:nums1 有序数组1,nums2 有序数组2 // 返回值:两个有序数组中位数 function findMedianSortedArrays(nums1, nums2) { // 确保 nums1 长度小于等于 nums2 长度 if (nums1.length > nums2.length) { return findMedianSortedArrays(nums2, nums1); } // 对 nums1 进行二分查找,将两个数组分为两部分 let len1 = nums1.length; let len2 = nums2.length; let left = 0; let right = len1; while (left <= right) { let i = Math.floor((left + right) / 2); let j = Math.floor((len1 + len2 + 1) / 2) - i; // i 太小了,需要增加 if (i < len1 && nums2[j - 1] > nums1[i]) { left = i + 1; } // i 太大了,需要减少 else if (i > 0 && nums1[i - 1] > nums2[j]) { right = i - 1; } // i 符合条件 else { let maxLeft = 0; if (i === 0) { maxLeft = nums2[j - 1]; } else if (j === 0) { maxLeft = nums1[i - 1]; } else { maxLeft = Math.max(nums1[i - 1], nums2[j - 1]); } // 数组总长度为奇数,返回左半部分的最大值 if ((len1 + len2) % 2 === 1) { return maxLeft; } let minRight = 0; if (i === len1) { minRight = nums2[j]; } else if (j === len2) { minRight = nums1[i]; } else { minRight = Math.min(nums1[i], nums2[j]); } // 数组总长度为偶数,返回左半部分的最大值和右半部分的最小值的平均数 return (maxLeft + minRight) / 2; } } } ``` 该算法的时间复杂度为 O(log(min(m,n))),其中 m 和 n 分别为两个数组的长度。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值