C语言有15个数按由小到大的顺序存放在一个数组中,输入一个数,要求用折半查找法找出该数是数据中第几个元素的值。如果该数不在数组中,则输出“无此数”
时间: 2024-05-06 19:21:43 浏览: 127
好的,我可以回答你的问题。这是一个比较常见的算法题目,可以通过如下代码实现折半查找:
```c
#include <stdio.h>
int binarySearch(int arr[], int n, int x) {
int low = 0, high = n - 1;
while (low <= high) {
int mid = (low + high) / 2;
if (arr[mid] == x) {
return mid;
} else if (arr[mid] < x) {
low = mid + 1;
} else {
high = mid - 1;
}
}
return -1;
}
int main() {
int arr[15] = {1, 3, 4, 6, 7, 8, 9, 10, 13, 14, 16, 19, 20, 22, 25};
int n = sizeof(arr) / sizeof(arr[0]);
int x;
printf("请输入一个数:");
scanf("%d", &x);
int index = binarySearch(arr, n, x);
if (index == -1) {
printf("无此数\n");
} else {
printf("%d是数据中第%d个元素的值\n", x, index + 1);
}
return 0;
}
```
在这段代码中,我们首先定义了一个 `binarySearch` 函数来进行折半查找。该函数接收三个参数:一个数组 `arr`、数组元素个数 `n` 和要查找的值 `x`。函数返回值为 `x` 在数组 `arr` 中的下标,如果不存在则返回 `-1`。
在函数中,我们首先将搜索区间的左右边界 `low` 和 `high` 分别赋值为数组的第一个元素下标和最后一个元素下标。在每一次循环中,我们将搜索区间中间位置的元素值 `arr[mid]` 与要查找的值 `x` 进行比较:
- 如果 `arr[mid]` 等于 `x`,说明我们找到了要查找的值,直接返回 `mid`。
- 如果 `arr[mid]` 小于 `x`,说明要查找的值在右侧区间,因此将搜索区间的左边界 `low` 更新为 `mid + 1`。
- 如果 `arr[mid]` 大于 `x`,说明要查找的值在左侧区间,因此将搜索区间的右边界 `high` 更新为 `mid - 1`。
当 `low` 大于 `high` 的时候,说明搜索区间已经为空,该元素不存在于数组中,因此返回 `-1`。
最后在 `main` 函数中,我们定义了一个 `arr` 数组和要查找的值 `x`,并调用 `binarySearch` 函数来查找 `x` 在 `arr` 中的下标。如果返回值为 `-1`,说明 `x` 不存在于数组中,输出 `"无此数"`,否则输出 `"x是数据中第index+1个元素的值"`。
阅读全文