设a[0:n-1]是已经排好序的数组,请改写二分搜索算法,使得: 当搜索元素x不在数组中时,返回小于x的最大元素位置i 和大于x的最小元素位置 j (完整源码,含测试代码) 当搜索元素x在数组中时,返回元素x在数组中的位置
时间: 2024-09-16 15:01:30 浏览: 116
在已经排序的数组`a[0:n-1]`上进行二分搜索并同时处理查找元素`x`不存在和存在的情况,可以稍微修改原始二分搜索的逻辑。以下是使用Python语言实现的版本:
```python
def binary_search_with_extrema(a, n, x):
left = 0
right = n - 1
max_index = left
min_index = right
while left <= right:
mid = (left + right) // 2
# 如果x在数组中
if a[mid] == x:
return mid
# 如果x大于中间元素,则更新最大值的位置
elif a[mid] < x:
left = mid + 1
if left == n or a[left] > x:
max_index = left - 1 # 如果左边界已超过,更新最大值
else:
min_index = mid # 否则更新最小值
else: # x小于中间元素
right = mid - 1
# 返回小于x的最大元素位置和大于x的最小元素位置
return max_index, min_index
# 测试代码
a = [1, 2, 3, 4, 5, 6, 7]
n = len(a)
x = 4
result = binary_search_with_extrema(a, n, x)
if result[0] != -1:
print(f"Element {x} found at index {result[0]}")
else:
print(f"Element {x} not found. Smallest greater element is at index {result[0]}, "
f"Largest smaller element is at index {result[1]}")
```
阅读全文