二分法的查找有序数中的一个数

本文详细介绍了如何运用二分查找算法在已排序的数组中寻找特定数值。通过逐步缩小搜索范围,二分查找能显著提高查找效率,其时间复杂度为O(log n)。文中会解释二分查找的逻辑,并给出相应的代码实现。
   Hello,大家好,今天Val来给大家分享一下关于二分法查找有序数中的一个数的代码实现方法,用递归和非递归方法实现。
   1.先讲一下递归方法实现,函数传参,参数包括(数组,左下标,右下标,查找数),代码实现如下:
int BinarySearch(int *array, int left,int right, int key)
{
    int mid = left - (( left - right) >> 1);
    if (left > right)
    {
        return -1;//如果没找到,返回-1
    }
    else if (array[mid] > key)
    {
        right = mid - 1; 
使用二分法查找两个有序组中位的核心思想是不需要实际合并组,而是通过二分法在两个组中找到一个合适的分割线,使得分割线左边的所有元素都小于右边的元素,并且左边的元素量等于或比右边多一个(根据总长度的奇偶性),然后根据分割线附近的元素来确定中位[^2]。 以下是使用C++实现的代码示例: ```cpp #include <vector> #include <climits> class Solution { public: double findMedianSortedArrays(std::vector<int>& nums1, std::vector<int>& nums2) { int n = nums1.size(), m = nums2.size(); if (n > m) return findMedianSortedArrays(nums2, nums1); int l1 = 0, l2 = 0, r1 = 0, r2 = 0, c1, c2, lo = 0, hi = n; while (lo <= hi) { c1 = (hi + lo + 1) / 2; c2 = (m + n) / 2 - c1; l1 = (c1 == 0) ? INT_MIN : nums1[c1 - 1]; r1 = (c1 == n) ? INT_MAX : nums1[c1]; l2 = (c2 == 0) ? INT_MIN : nums2[c2 - 1]; r2 = (c2 == m) ? INT_MAX : nums2[c2]; if (l1 > r2) hi = c1 - 1; else if (l2 > r1) lo = c1 + 1; else break; } if ((m + n) % 2) return std::min(r1, r2); else return ((long long)std::max(l1, l2) + (long long)std::min(r1, r2)) / 2.0; } }; ``` ### 代码解释 1. **确保`nums1`是较短的组**:为了减少二分查找的范围,交换两个组,确保`nums1`是较短的组。 2. **二分查找分割点**:在`nums1`上进行二分查找,找到合适的分割点`c1`,根据`c1`计算`nums2`的分割点`c2`。 3. **确定分割线左右的元素**:根据分割点确定分割线左右的元素`l1`、`r1`、`l2`、`r2`。 4. **调整分割点**:如果`l1 > r2`,说明分割点`c1`太大,需要向左移动;如果`l2 > r1`,说明分割点`c1`太小,需要向右移动。 5. **计算中位**:根据总长度的奇偶性计算中位。 ### 复杂度分析 - **时间复杂度**:$O(log(min(m, n)))$,其中`m`和`n`分别是两个组的长度。 - **空间复杂度**:$O(1)$,只使用了常级的额外空间。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值