考研数据结构——C语言实现折半查找
首先定义了一个有序数组a
,然后计算出数组的长度n
。接着定义了一个要查找的元素x
,值为79。binarySearch
函数实现了二分查找算法,它接受数组、左右边界和目标值作为参数,通过不断缩小搜索范围来查找目标值。如果找到了目标值,函数返回其在数组中的索引;如果没有找到,返回-1。
在main
函数中,定义了数组的左右边界,并调用binarySearch
函数进行查找。根据返回的结果,使用printf
函数打印出目标值在数组中的索引或者提示信息。最后,程序正常结束,返回0。
函数binarySearch
实现了二分查找算法。它接收四个参数:数组arr
,搜索范围的左右边界l
和r
,以及要查找的目标值x
。函数的工作原理如下:
- 使用
while
循环,只要左边界l
小于右边界r
,就继续查找。 - 计算中间位置
mid
,这是通过取l
和r
的平均值来实现的,使用l + (r - l) / 2
的写法可以防止在计算l + r
时发生整数溢出。 - 如果目标值
x
大于中间位置的值arr[mid]
,则将左边界l
更新为mid + 1
,缩小搜索范围到右半部分。 - 如果目标值
x
小于中间位置的值arr[mid]
,则将右边界r
更新为mid
,缩小搜索范围到左半部分。 - 如果找到目标值
x
,则返回当前的中间位置mid
作为元素的索引。 - 如果循环结束都没有找到目标值,则返回-1,表示元素不在数组中。
#include <stdio.h>int a[] = { 1, 3, 4, 4, 6, 17, 79, 81, 90 }; // 修正数组初始化
int n = sizeof(a) / sizeof(a[0]); // 计算数组元素数量
int x = 79;// 二分查找函数
int binarySearch(int arr[], int l, int r, int x) {while (l < r) {int mid = l + (r - l) / 2; // 防止溢出的写法if (x > arr[mid]) {l = mid + 1;}else if (x < arr[mid]) {r = mid;}else {return mid; // 找到元素,返回索引}}return -1; // 未找到元素,返回-1
}int main() {int left = 0, right = n - 1, result;result = binarySearch(a, left, right, x);if (result != -1) {printf("元素 %d 在数组中的索引是 %d。\n", x, result);}else {printf("数组中没有元素 %d。\n", x);}return 0;
}