原生数组二分查找需数组已排序,用left、right、mid三变量控制边界,mid=left+(right-left)/2防溢出,相等返下标,否则缩区间,未找到返-1。
在初级项目开发中,用原生数组实现标准二分查找,关键不是写得多炫,而是写得稳、准、可复用。它不依赖任何框架或库,纯靠数组本身 + 逻辑控制,适合嵌入小型工具、教学练习或嵌入式轻量场景。
必须满足的前提条件
二分查找不是万能钥匙,它只对已排序的原生数组有效(升序最常见,降序也可适配)。如果数组是乱序的,必须先排序(比如用 qsort 或冒泡),否则结果不可信。初学者常跳过这步直接写查找,结果“找得到却找不到”,其实是数据没排好。
- 升序示例:
int arr[] = {2, 5, 8, 13, 21, 34, 55}; - 降序需改比较逻辑(如把
arr[mid] 改为 <code>arr[mid] > target) - C语言中用
sizeof(arr)/sizeof(arr[0])算长度,但仅限栈上定义的数组(不能用于指针传参)
核心三变量与循环结构
用三个整型变量控制边界和中间点:left(起点下标)、right(终点下标)、mid(动态中点)。整个查找封装在一个 while (left 循环里,这是最安全的终止条件——一旦 <code>left > right,说明区间为空,目标一定不存在。
-
mid = left + (right - left) / 2是推荐写法,比(left + right) / 2更防整数溢出(尤其在大数组或嵌入式环境下) - 每次比较后只移动一个边界:
arr[mid] ;<code>arr[mid] > target → right = mid - 1 - 找到即返回
mid;循环结束仍未返回,就返回-1表示未找到(比用 flag 变量更符合函数式习惯)
一个可直接复制粘贴的 C 函数模板
以下是一个干净、无副作用、带注释的标准实现,适用于大多数初级项目:
int binary_search(int arr[], int size, int target) {
int left = 0;
int right = size - 1;
<pre class="brush:php;toolbar:false;">while (left <p>}</p>- 调用方式简单:
int idx = binary_search(my_arr, 10, 7); - 函数接收数组首地址、元素个数、目标值,不修改原数组
- 返回值统一:成功返回非负下标,失败返回 -1(便于后续判断和链式处理)
调试与验证的小技巧
初级开发最容易卡在“逻辑没错但总返回 -1”。建议加两行打印辅助定位:
- 在循环内加
printf("L=%d, R=%d, M=%d, arr[M]=%d\n", left, right, mid, arr[mid]); - 手动走一遍小例子:查
{1,3,5,7,9}中的7,观察每轮 L/R/M 如何收缩 - 边界测试必做:查最小值、最大值、不存在的值(如 0 或 10)、空数组(size=0)











