设是已排好序的数组。请改写二分搜索算法,使得当搜索元素不在数组中时,返回小于的最大元素位置和大于的最小元素位置。当搜索元素在数组中时,和相同,均为在数组中的位置 C语言代码
时间: 2024-09-21 11:13:11 浏览: 31
二分搜索 设a[0:n-1]是一个已排好序的数组。请改写二分搜索算法,使得当搜索元素x不在数组中时,返回小于x的最大元素的位置I和大于x的最大元素位置j
在C语言中,我们可以修改传统的二分查找算法(Binary Search),使其不仅找到目标值的位置,还返回其左侧最大元素和右侧最小元素的位置。如果目标值不存在,我们会在左右边界之间移动,直到找到合适的插入点。以下是实现这一功能的代码:
```c
#include <stdio.h>
// 帮助函数,返回左、右边界及中间元素的索引
void getMinMax(int arr[], int low, int high, int target, int *left, int *right) {
if (low > high) {
*left = -1; // 如果目标不存在,设置左边界为-1
*right = -1;
return;
}
int mid = (low + high) / 2;
if (arr[mid] == target) { // 目标值在数组中
*left = mid; // 返回目标值位置
*right = mid; // 因为数组有序,所以两侧都是自身
} else if (arr[mid] < target) { // 需要在mid右边寻找
getMinMax(arr, mid + 1, high, target, left, right);
} else { // 需要在mid左边寻找
getMinMax(arr, low, mid - 1, target, left, right);
}
}
// 主函数演示如何使用
int main() {
int arr[] = {1, 3, 4, 6, 8, 9, 10};
int n = sizeof(arr) / sizeof(arr[0]);
int target = 5; // 搜索元素
int left, right;
getMinMax(arr, 0, n - 1, target, &left, &right);
printf("Target %d is at position %d.\n", target, left);
printf("Smallest element greater than target is at position %d and largest element less than target is at position %d.\n",
left + 1, right);
return 0;
}
```
这个代码首先检查中间元素是否等于目标,然后递归地向左或向右查找。找到目标值或确定它不在数组内后,更新左边界(左侧最大元素)和右边界(右侧最小元素)。注意,当目标值不存在时,`left` 和 `right` 分别表示可以插入新元素的两个位置。
阅读全文