二分查找是一种在有序数组中查找特定元素的有效算法。其基本思想是将目标值与数组中间元素进行比较,通过比较结果缩小搜索范围,逐步接近目标值。以下是一个用C语言实现的二分查找算法示例:
c
#include <stdio.h>
// 二分查找函数
int binarySearch(int arr[], int l, int r, int x) {
while (l <= r) {
int m = l + (r - l) / 2; // 计算中间索引,这种写法可以防止溢出
// 检查x是否正好是中间元素
if (arr[m] == x) {
return m;
}
// 如果x大于中间元素,则只在右半部分查找
if (arr[m] < x) {
l = m + 1;
}
// 否则在左半部分查找
else {
r = m - 1;
}
}
// 如果执行到这里,说明没有找到
return -1;
}
int main() {
int arr[] = {2, 3, 4, 10, 40};
int n = sizeof(arr) / sizeof(arr[0]);
int x = 10;
int result = binarySearch(arr, 0, n - 1, x);
if (result == -1) {
printf("元素不在数组中\n");
} else {
printf("元素位于索引 %d\n", result);
}
return 0;
}
代码解析
-
函数定义:
int binarySearch(int arr[], int l, int r, int x)
:接收一个数组arr
,搜索范围的左端点l
和右端点r
,以及要查找的元素x
。
-
循环条件:
while (l <= r)
:只要左端点不超过右端点,就继续搜索。
-
中间索引的计算:
int m = l + (r - l) / 2
:这种方式计算中值可以防止l
和r
相加时溢出。
-
比较与分支:
- 如果中间元素正好等于目标值,则返回中间索引。
- 如果目标值大于中间元素,则更新左端点
l
,继续在右半部分搜索。 - 如果目标值小于中间元素,则更新右端点
r
,继续在左半部分搜索。
-
结果处理:
- 如果循环结束还没有找到,则返回
-1
表示元素不在数组中。
- 如果循环结束还没有找到,则返回
这种二分查找算法仅适用于已排序的数组。如果数组未排序,则必须先进行排序,或使用其他搜索技术。