设a[0:n-1]是已排好序的数组。请改写二分搜索算法,使得当搜索元素x不在数组中时,返回小于x的最大元素位置i和大于x的最小元素位置j。当搜索元素在数组中时,i 和j相同,均为x在数组中的位置。的全代码
时间: 2024-09-24 22:10:05 浏览: 67
这是一个修改过的二分搜索算法,也称为二分查找范围,同时找到了目标值周围的边界。以下是使用Python编写的示例代码:
```python
def binary_search_range(arr, x):
left = 0
right = len(arr) - 1
i = j = -1 # 初始化最大元素位置i和最小元素位置j为-1
while left <= right:
mid = (left + right) // 2
if arr[mid] == x:
i = j = mid # 如果找到x,则更新i和j
break
elif arr[mid] < x:
left = mid + 1
if mid > 0 and arr[mid - 1] >= x: # 如果arr[mid]小于x,寻找左边第一个大于等于x的元素
i = mid - 1
else:
right = mid - 1
if mid < len(arr) - 1 and arr[mid + 1] <= x: # 如果arr[mid]大于x,寻找右边第一个小于等于x的元素
j = mid + 1
return i, j
# 示例数组
sorted_arr = [1, 2, 4, 5, 7, 8, 9]
target_x = 6
result = binary_search_range(sorted_arr, target_x)
print(f"小于{target_x}的最大元素位置:{result[0]}")
print(f">={target_x}的最小元素位置:{result[1]}")
```
这个版本的二分搜索会在找到目标值`x`的同时,记录下左右两侧满足条件的边界值。如果没有找到目标值,函数会返回这两个边界值,分别代表大于或小于`x`的最近元素的位置。
阅读全文