在编程世界中,C++二分搜索算法是一种非常经典且高效的查找方法。无论你是刚入门的编程小白,还是正在准备技术面试的开发者,掌握二分查找实现都是必不可少的技能。本文将用最通俗易懂的方式,带你一步步理解并编写属于你自己的二分搜索代码。
二分搜索(Binary Search),也叫折半查找,是一种在已排序数组中快速查找特定元素的算法。它的核心思想是:每次将搜索范围缩小一半,从而大大减少比较次数。
举个例子:假设你有一本按字母顺序排列的电话簿,要找“张三”的电话。你不会一页一页翻,而是直接翻到中间,看看“张三”是在前半本还是后半本,然后重复这个过程,直到找到目标。这就是二分搜索的思路!
下面是一个标准的迭代式二分查找实现,适用于升序排列的数组:
#include <iostream>#include <vector>using namespace std;// 二分查找函数:在有序数组中查找 targetint binarySearch(const vector<int>& arr, int target) { int left = 0; int right = arr.size() - 1; while (left <= right) { int mid = left + (right - left) / 2; // 防止溢出 if (arr[mid] == target) { return mid; // 找到目标,返回下标 } else if (arr[mid] < target) { left = mid + 1; // 在右半部分查找 } else { right = mid - 1; // 在左半部分查找 } } return -1; // 未找到,返回 -1}int main() { vector<int> nums = {1, 3, 5, 7, 9, 11, 13, 15}; int target = 7; int result = binarySearch(nums, target); if (result != -1) { cout << "元素 " << target << " 在索引 " << result << " 处找到。" << endl; } else { cout << "元素 " << target << " 未找到。" << endl; } return 0;} mid = left + (right - left) / 2?你可能会看到有些教程写成 mid = (left + right) / 2。虽然结果一样,但当 left 和 right 都很大时,相加可能导致整数溢出。而 left + (right - left) / 2 能有效避免这个问题,是更安全的写法。
除了迭代,也可以用递归来实现。虽然递归代码更简洁,但要注意栈空间的消耗:
int binarySearchRecursive(const vector<int>& arr, int left, int right, int target) { if (left > right) { return -1; } int mid = left + (right - left) / 2; if (arr[mid] == target) { return mid; } else if (arr[mid] < target) { return binarySearchRecursive(arr, mid + 1, right, target); } else { return binarySearchRecursive(arr, left, mid - 1, target); }} 二分搜索每次将问题规模减半,因此其时间复杂度为 O(log n),远优于线性查找的 O(n)。这也是为什么高效搜索算法中二分查找如此受欢迎。
通过本篇C++算法教程,你应该已经掌握了二分搜索的基本原理、两种实现方式以及注意事项。记住:数组必须有序!多加练习,你就能在面试和项目中灵活运用这一高效搜索算法。
小提示:尝试修改代码,使其能查找“第一个大于等于 target 的位置”,这是面试高频题哦!
本文由主机测评网于2025-12-05发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://www.vpshk.cn/2025123498.html