C++中如何实现二分查找算法

来源:AI社区作者:柬埔寨程序员头衔:程序员
导读:本期聚焦于小伙伴创作的《C++中如何实现二分查找算法》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《C++中如何实现二分查找算法》有用,将其分享出去将是对创作者最好的鼓励。

二分查找是一种针对有序序列的高效查找算法,核心思路是通过不断缩小查找区间,每次将查找范围缩小一半,最终定位到目标元素的位置。在C++中实现二分查找需要保证待查找的序列是升序或降序排列的,否则无法得到正确结果。

C++中如何实现二分查找算法

二分查找的实现前提

使用二分查找之前需要满足两个核心条件:

  • 待查找的序列必须是已经排好序的,通常默认是升序序列,如果是降序序列需要微调比较逻辑。
  • 序列需要支持随机访问,比如数组、vector等容器,链表这类不支持随机访问的容器不适合使用二分查找。

迭代方式实现二分查找

迭代实现是二分查找最常用的实现方式,通过维护左右两个边界指针,不断调整区间范围,直到找到目标元素或者区间为空。

#include <iostream>
#include <vector>
using namespace std;

// 迭代方式实现二分查找,返回目标元素的索引,不存在则返回-1
int binarySearchIterative(const vector<int>& nums, int target) {
    int left = 0;
    int right = nums.size() - 1; // 右边界初始化为最后一个元素的索引
    while (left <= right) {
        // 计算中间索引,避免(left + right)溢出,使用left + (right - left) / 2
        int mid = left + (right - left) / 2;
        if (nums[mid] == target) {
            return mid; // 找到目标元素,返回索引
        } else if (nums[mid] < target) {
            left = mid + 1; // 目标在右半区间,更新左边界
        } else {
            right = mid - 1; // 目标在左半区间,更新右边界
        }
    }
    return -1; // 遍历完区间未找到目标元素
}

int main() {
    vector<int> arr = {1, 3, 5, 7, 9, 11, 13};
    int target = 7;
    int result = binarySearchIterative(arr, target);
    if (result != -1) {
        cout << "找到目标元素,索引为:" << result << endl;
    } else {
        cout << "未找到目标元素" << endl;
    }
    return 0;
}

递归方式实现二分查找

递归实现二分查找的思路和迭代一致,只是把区间调整的逻辑放到递归函数中,通过递归调用不断缩小查找范围。

#include <iostream>
#include <vector>
using namespace std;

// 递归辅助函数,接收当前查找区间的左右边界
int binarySearchRecursiveHelper(const 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 mid;
    } else if (nums[mid] < target) {
        return binarySearchRecursiveHelper(nums, target, mid + 1, right);
    } else {
        return binarySearchRecursiveHelper(nums, target, left, mid - 1);
    }
}

// 对外暴露的递归二分查找接口
int binarySearchRecursive(const vector<int>& nums, int target) {
    if (nums.empty()) {
        return -1;
    }
    return binarySearchRecursiveHelper(nums, target, 0, nums.size() - 1);
}

int main() {
    vector<int> arr = {2, 4, 6, 8, 10, 12};
    int target = 8;
    int result = binarySearchRecursive(arr, target);
    if (result != -1) {
        cout << "找到目标元素,索引为:" << result << endl;
    } else {
        cout << "未找到目标元素" << endl;
    }
    return 0;
}

两种实现方式的对比

对比维度迭代实现递归实现
空间复杂度O(1),不需要额外的栈空间O(log n),递归调用需要栈空间
执行效率更高,没有函数调用的开销稍低,存在递归调用的开销
代码可读性逻辑直观,容易理解边界调整逻辑简洁,符合二分查找的递归定义

使用二分查找的注意事项

  • 中间索引的计算不要直接使用(left + right) / 2,当left和right都很大时,相加可能会超出int类型的范围导致溢出,推荐使用left + (right - left) / 2的计算方式。
  • 循环条件使用left <= right而不是left < right,如果写成后者,当区间只剩下一个元素时循环会直接结束,可能会漏掉对最后一个元素的判断。
  • 如果序列中存在多个相同的目标元素,上述实现返回的是任意一个的索引,如果需要返回第一个或最后一个出现的位置,需要调整边界调整的逻辑。
  • 对于C++标准库,已经提供了std::binary_searchstd::lower_boundstd::upper_bound等现成的二分查找相关函数,实际开发中如果不需要自定义逻辑,可以直接使用这些标准库函数提升开发效率。

二分查找C++查找算法algorithm修改时间:2026-07-06 19:48:25

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。