小米:你还在为二分查找苦恼吗?
ingxelpr:嗯!不学会了话是回不了家的。
小米:看着!是这么算的!
- 将查找区间的左边界和右边界初始化为数组的首尾元素的索引。
- 计算区间的中间位置。
- 若中间位置的值等于目标值,则返回查找成功;若中间位置的值大于目标值,则将右边界更新为中间位置的前一个位置,缩小查找区间为左半部分;若中间位置的值小于目标值,则将左边界更新为中间位置的后一个位置,缩小查找区间为右半部分。
- 重复步骤2和3,直到左边界大于右边界时,表示查找失败。
ingxelpr:可爷爷还叫我要把C++代码编出来……
小米:好好好!代码也给出来!
#include <iostream>
using namespace std;
int binarySearch(int arr[], int left, int right, int target) {
while (left <= right) {
int mid = left + (right - left) / 2;
// 如果目标值等于中间值,返回中间值的索引
if (arr[mid] == target) {
return mid;
}
// 如果目标值小于中间值,在左半部分继续查找
if (arr[mid] > target) {
right = mid - 1;
}
// 如果目标值大于中间值,在右半部分继续查找
else {
left = mid + 1;
}
}
// 如果元素不存在,返回-1
return -1;
}
int main() {
int arr[] = { 2, 4, 6, 8, 10, 12, 14, 16, 18, 20 };
int target = 12;
int n = sizeof(arr) / sizeof(arr[0]);
int result = binarySearch(arr, 0, n - 1, target);
if (result == -1) {
cout << "Element not found" << endl;
}
else {
cout << "Element found at index " << result << endl;
}
return 0;
}
小米:行了吧!
ingxelpr:不好!爷爷来了!
小米:不是我,不是我,不是我我没教他!