二分法查找也叫折半查找,核心逻辑是在有序数组中,每次取中间元素和目标值对比,根据对比结果缩小查找范围,直到找到目标元素或者确定元素不存在。这种方法的时间复杂度是O(logn),比顺序查找的O(n)效率高很多,适合处理数据量较大的有序数组查找场景。

二分法查找的基本逻辑
要实现二分法查找,首先需要保证待查找的数组是升序或者降序排列的,本文以升序数组为例说明实现步骤:
- 定义两个指针,分别指向数组的起始位置
left和结束位置right - 计算中间位置
mid = left + (right - left) / 2,避免直接相加导致整数溢出 - 对比
arr[mid]和目标值target:- 如果
arr[mid] == target,说明找到目标元素,返回mid下标 - 如果
arr[mid] < target,说明目标元素在右半部分,更新left = mid + 1 - 如果
arr[mid] > target,说明目标元素在左半部分,更新right = mid - 1
- 如果
- 重复上述步骤,直到
left > right,说明数组中不存在目标元素,返回-1表示查找失败
c语言实现二分法查找数组元素的完整代码
下面是完整的c语言实现代码,包含数组定义、二分查找函数、主函数测试逻辑:
#include <stdio.h>
// 二分法查找函数,arr是升序数组,size是数组长度,target是目标查找值
// 找到返回元素下标,找不到返回-1
int binarySearch(int arr[], int size, int target) {
int left = 0;
int right = size - 1;
while (left <= right) {
// 计算中间位置,避免left+right溢出
int mid = left + (right - left) / 2;
if (arr[mid] == target) {
return mid; // 找到目标元素,返回下标
} else if (arr[mid] < target) {
left = mid + 1; // 目标在右半部分,移动左指针
} else {
right = mid - 1; // 目标在左半部分,移动右指针
}
}
return -1; // 循环结束没找到,返回-1
}
int main() {
// 定义升序测试数组
int arr[] = {1, 3, 5, 7, 9, 11, 13, 15, 17, 19};
int size = sizeof(arr) / sizeof(arr[0]); // 计算数组长度
int target1 = 7;
int target2 = 8;
// 测试查找存在的元素
int result1 = binarySearch(arr, size, target1);
if (result1 != -1) {
printf("找到元素%d,下标为%dn", target1, result1);
} else {
printf("数组中不存在元素%dn", target1);
}
// 测试查找不存在的元素
int result2 = binarySearch(arr, size, target2);
if (result2 != -1) {
printf("找到元素%d,下标为%dn", target2, result2);
} else {
printf("数组中不存在元素%dn", target2);
}
return 0;
}
实现注意事项
在实际编写c语言二分法查找代码时,有几个细节需要特别注意:
- 数组必须是有序的,如果数组无序,需要先排序再使用二分法,否则查找结果没有意义
- 中间下标的计算不要用
(left + right) / 2,当left和right都很大时,相加可能会超过int类型的最大值导致溢出,用left + (right - left) / 2更安全 - 循环条件用
left <= right,如果写成left < right,当数组只有一个元素且是目标值时,会直接跳过查找逻辑返回-1 - 更新指针时,left要加1,right要减1,否则可能出现死循环,比如当left和right相邻时,mid会一直等于left,无法缩小范围
二分法的适用场景
二分法虽然效率高,但不是所有场景都适用:
- 只适用于有序的数组或者可以随机访问的有序数据结构,链表因为不支持随机访问,不适合用二分法
- 如果数组频繁插入删除元素,需要不断维护有序性,此时二分法的优势会被排序的成本抵消,更适合用其他数据结构
- 数据量很小的时候,顺序查找的性能和二分法差距不大,甚至更简单,不需要强行使用二分法
c语言二分法数组查找binary_search修改时间:2026-07-11 09:51:30