二分查找(Binary Search)是一种在有序数组中查找特定元素的搜索算法。它的工作原理是将待搜索的区间分成两半,判断目标值是在左半部分还是右半部分,然后继续在相应的半区内进行查找,直到找到目标值或搜索区间被缩小为0。二分查找的时间复杂度为O(log n),其中n是数组中的元素数量,这使得它成为在有序数组中查找元素的非常高效的算法。
算法步骤
-
初始化:设置两个指针(或索引),
low
指向数组的第一个元素,high
指向数组的最后一个元素。 -
循环条件:当
low
小于等于high
时,执行循环。 -
计算中点:通过
(low + high) / 2
(或使用位运算low + (high - low) / 2
来避免溢出)计算中点mid
。 -
比较中点与目标值:
- 如果
arr[mid]
等于目标值,则查找成功,返回mid
。 - 如果
arr[mid]
小于目标值,则说明目标值在mid
的右侧,更新low = mid + 1
。 - 如果
arr[mid]
大于目标值,则说明目标值在mid
的左侧,更新high = mid - 1
。
- 如果
-
循环结束:如果循环结束仍未找到目标值,则说明目标值不在数组中,返回未找到的消息或特定值(如-1)。
#include <iostream>
#include <vector>
using namespace std;
// 二分查找函数
int binarySearch(const vector<int>& arr, int target) {
int low = 0, high = arr.size() - 1;
while (low <= high) {
int mid = low + (high - low) / 2; // 防止溢出的中点计算
if (arr[mid] == target) {
return mid; // 找到目标值,返回索引
} else if (arr[mid] < target) {
low = mid + 1; // 调整搜索区间到右半部分
} else {
high = mid - 1; // 调整搜索区间到左半部分
}
}
return -1; // 未找到目标值
}
int main() {
vector<int> arr = {2, 3, 4, 10, 40}; // 示例有序数组
int target = 10; // 我们要查找的目标值
int result = binarySearch(arr, target); // 调用二分查找函数
if (result != -1) {
cout << "Element found at index: " << result << endl;
} else {
cout << "Element not found" << endl;
}
return 0;
}