写出下面问题的C代码:设a[0:n-1]是一个已排好序的数组。请改写二分搜索算法,使得当搜索元素x不在数组中时,返回小于x的最大元素的位置i和大于x的最小元素位置j。当搜索元素在数组中时,i和j相同,均为x在数组中的位置。并对自己的程序进行复杂性分析。
时间: 2024-10-08 11:22:20 浏览: 60
```c
#include <stdio.h>
#include <stdlib.h>
// 定义二分查找函数,返回索引i和j
int* binary_search(int arr[], int n, int target) {
int low = 0, high = n - 1;
int *result = (int*)malloc(sizeof(int) * 2); // 分配空间存储i和j
if (arr[low] > target || arr[high] < target) { // 如果目标不存在于数组
result[0] = low; // 小于target的最大元素下标
result[1] = high; // 大于target的最小元素下标
} else {
int mid;
while (low <= high) {
mid = (low + high) / 2;
if (arr[mid] == target) {
result[0] = result[1] = mid; // x存在,直接返回其下标
break;
} else if (arr[mid] < target) {
low = mid + 1;
result[0] = mid;
} else {
high = mid - 1;
result[1] = mid;
}
}
}
return result;
}
// 示例数组和值
int main() {
int arr[] = {1, 2, 3, 4, 5, 6, 7};
int n = sizeof(arr) / sizeof(arr[0]);
int target = 5;
int *indices = binary_search(arr, n, target);
if (indices != NULL) {
printf("小于 %d 的最大元素在下标 %d, 大于 %d 的最小元素在下标 %d.\n",
target, indices[0], target, indices[1]);
free(indices); // 注意释放内存
}
return 0;
}
```
复杂性分析:
- 时间复杂度:平均情况和最坏情况都是 O(log n),因为每次迭代我们都会将搜索范围减半。
- 空间复杂度:O(1),除了输入数组本身,我们只额外分配了两个整数用于存储结果。
阅读全文