用C语言【问题描述】 使用折半查找法实现输入一个有序(非降序)数组A,可含有重复元素,求最大的i使得A[i]小于target,不存在则返回 -1 【输入形式】 第一行:非降序数组A 第二行:target
时间: 2024-10-26 08:02:28 浏览: 62
在C语言中,你可以使用折半查找(Binary Search)算法来实现这个功能。由于数组是有序的,我们可以利用二分查找的思想找到第一个大于或等于`target`的元素的位置,然后返回它的前一个位置作为结果,因为题目要求的是比`target`小的最大值。
以下是实现该功能的C语言代码示例:
```c
#include <stdio.h>
int binary_search(int A[], int n, int target) {
int left = 0;
int right = n - 1;
while (left <= right) {
int mid = left + (right - left) / 2;
// 如果mid元素大于目标,则说明目标可能在左半部分
if (A[mid] >= target) {
right = mid - 1; // 更新右边界
} else { // 否则,目标在右半部分或等于mid
left = mid + 1; // 更新左边界
}
}
// 如果找不到满足条件的元素,返回-1
return (A[left] < target) ? left : -1;
}
int main() {
int A[100]; // 假设数组长度不超过100
int n, target;
// 输入数组和目标值
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%d", &A[i]);
}
scanf("%d", &target);
// 调用函数并打印结果
int result = binary_search(A, n, target);
printf("最大索引:%d\n", result == -1 ? "不存在" : result);
return 0;
}
```
阅读全文