📜  递归二分搜索 - C++ (1)

📅  最后修改于: 2023-12-03 15:28:22.567000             🧑  作者: Mango

递归二分搜索 - C++

二分搜索是一种常用的查找算法, 在有序数组中查找目标值的时候效率很高. 递归二分搜索是一种将二分搜索算法通过递归来实现的方式.

实现

我们定义递归函数 binarySearch, 它的三个参数分别是: 要搜索的数组, 目标值, 数组的左端点和右端点.

int binarySearch(vector<int>& nums, int target, int left, int right) {
    // 递归终止条件
    if (left > right) {
        return -1;
    }

    // 计算中间位置
    int mid = left + (right - left) / 2;

    // 如果目标值在左半边, 继续在左半边进行二分搜索
    if (nums[mid] > target) {
        return binarySearch(nums, target, left, mid - 1);
    }
    // 如果目标值在右半边, 继续在右半边进行二分搜索
    else if (nums[mid] < target) {
        return binarySearch(nums, target, mid + 1, right);
    }
    // 如果找到目标值, 返回下标
    else {
        return mid;
    }
}

我们通过传递左右两个下标, 在递归过程中不断缩小搜索区间.

递归的终止条件是当左下标大于右下标时, 说明已经搜索完毕整个数组, 依然没有找到目标值, 返回-1.

测试

我们进行一些测试来验证 binarySearch 函数的正确性.

int main() {
    vector<int> nums = {1, 3, 4, 5, 8, 10, 11};
    int target = 4;

    int index = binarySearch(nums, target, 0, nums.size() - 1);
    if (index != -1) {
        cout << "Found " << target << " at index " << index << endl;
    }
    else {
        cout << "Could not find " << target << endl;
    }

    target = 6;
    index = binarySearch(nums, target, 0, nums.size() - 1);
    if (index != -1) {
        cout << "Found " << target << " at index " << index << endl;
    }
    else {
        cout << "Could not find " << target << endl;
    }

    return 0;
}

输出:

Found 4 at index 2
Could not find 6
总结

递归二分搜索可以很方便地实现在有序数组中查找目标值的功能. 当然, 在实际的开发中我们也可以使用非递归的方式来实现二分搜索, 以减小调用栈的空间开销.