设a[0:n-1]是已排好序的数组。请改写二分搜索算法,使得当搜索元素x不在数组中时,返回小于x的最大元素位置i和大于x的最小元素位置j。当搜索元素在数组中时,i和j相同,均为x在数组中的位置。要求C++语言写出代码,并可以在VS上运行。
时间: 2024-09-30 14:04:21 浏览: 25
二分搜索 设a[0:n-1]是一个已排好序的数组。请改写二分搜索算法,使得当搜索元素x不在数组中时,返回小于x的最大元素的位置I和大于x的最大元素位置j
在C++中,你可以使用迭代的方式来实现这个功能,同时保持二分查找的思想。以下是代码示例:
```cpp
#include <vector>
#include <iostream>
int find_positions(const std::vector<int>& arr, int target) {
int left = 0;
int right = arr.size() - 1;
int i = left, j = right;
while (left <= right) {
int mid = left + (right - left) / 2; // 注意这里是对mid的计算,不是直接取中间值
if (arr[mid] == target) {
return mid;
} else if (arr[mid] < target) {
i = mid + 1;
left = mid + 1;
} else { // 如果arr[mid] > target
j = mid - 1;
right = mid - 1;
}
}
// 当target不存在于数组中,找到小于target的最大元素和大于target的最小元素的位置
if (arr[i] > target) {
i--;
}
if (arr[j] < target) {
j++;
}
return {i, j};
}
int main() {
std::vector<int> a = {1, 3, 4, 6, 8, 9, 11};
int x = 5;
auto [i, j] = find_positions(a, x);
std::cout << "Element " << x << " not found. Smallest element greater than " << x << " is at index " << i << ", and largest element less than " << x << " is at index " << j << std::endl;
x = 7;
[i, j] = find_positions(a, x);
std::cout << "Element " << x << " found at index " << i << std::endl;
return 0;
}
```
在这个例子中,`find_positions`函数接收一个排序好的整数向量和一个目标值。如果目标值存在,则返回其索引;如果不存在,则返回满足条件的左边界和右边界。
阅读全文