二分搜索算法是在排序列表中搜索特定元素的更有效方法。 与顺序检查元素的线性搜索不同,二分搜索将列表分成两半,并将目标元素与中间元素进行比较。 重复此过程,直到找到目标元素或搜索范围变空。
怎么运行的
- 从整个排序列表开始。
- 查找当前搜索范围的中间元素。
- 将中间元素与目标值进行比较。
- 如果中间元素等于目标值,则查找成功。
- 如果中间元素大于目标,则在范围的左半部分搜索。
- 如果中间元素小于目标,则在范围的右半部分搜索。
- 重复步骤2-6,直到找到目标元素或搜索范围变空。
例子
让我们考虑一个排序的整数列表,并希望使用二分查找找到数字 34。
排序列表:{12, 23, 34, 45, 56, 67, 89, 90}
- 从整个列表开始。
- 中间元素:56(位置 4)。 与34相比。
- 56 大于 34。在左半部分搜索。
- 新的中间元素:23(位置 1)。 与34相比。
- 23 比 34 小。在右半部分搜索。
- 新的中间元素:45(位置 3)。 与34相比。
- 45 大于 34。在左半部分搜索。
- 新的中间元素:34(位置 2)。 目标已找到。
C++ 示例代码
#include <iostream>
#include <vector>
int binarySearch(const std::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;
}
int main() {
std::vector<int> numbers = {12, 23, 34, 45, 56, 67, 89, 90};
int target = 34;
int result = binarySearch(numbers, target);
if(result != -1) {
std::cout << "Element " << target << " found at position " << result << std::endl;
} else {
std::cout << "Element " << target << " not found in the array" << std::endl;
}
return 0;
}
在给定的示例中,该 binarySearch
函数用于在整数排序列表中查找数字 34。 结果将是列表中 34 的位置(位置从 0 开始),如果未找到该数字,则结果为 -1。