“二分查找” 咋用?像 “查字典翻页码”,3 步找到目标值
很多零基础小伙伴觉得 “二分查找” 是 “复杂的算法技巧”,其实它就是 “在有序数组里快速找目标值的方法”—— 就像查字典时,你不会从第一页逐页翻到目标字,而是先翻到中间页,判断目标字在左边还是右边,再缩小范围继续找。今天用 “查字典” 的类比,讲透二分查找的前提、3 步核心步骤及考试高频考点,搭配实操示例和真题,让你 10 分钟就能掌握,考试遇到这类题轻松拿分。
先明确:为啥要学二分查找?考试性价比超高!
二分查找是数据结构与算法模块的 “高频考点”,上午选择题每年 1 道(比如 “二分查找的前提”“查找次数计算”),下午算法题偶尔考 “补全二分查找代码”,占算法模块 20% 的分值。而且它的逻辑固定,记清 “查字典” 的 3 步流程,就能应对所有考题,性价比远超其他复杂算法。
用 “查字典” 理解二分查找:核心逻辑一看就懂
假设你要查字典里的 “查” 字(拼音 “chá”),字典共 1000 页(页码 1-1000,对应有序数组 [1,2,...,1000]),目标是找到 “查” 字所在的页码(对应目标值)。你不会从第 1 页开始翻,而是这样操作:
- 先翻中间页:翻到第 500 页,看这一页的拼音范围;
- 判断方向:“chá” 在 “a-zh” 的中间偏后,第 500 页的拼音是 “m” 左右,所以 “查” 字在 501-1000 页(排除 1-500 页);
- 缩小范围再找:在 501-1000 页里,翻到中间页 750 页,继续判断方向…… 重复直到找到目标页码。
这就是二分查找的核心逻辑:每次通过 “折半” 把查找范围缩小一半,减少查找次数,比 “逐个数找(顺序查找)” 高效得多(比如 1000 个元素,顺序查找最多 1000 次,二分查找最多 10 次)。
第一步:明确二分查找的 “前提”—— 必须是 “有序数组”
这是二分查找的 “生命线”,就像查字典的前提是 “字典页码按拼音 / 部首排序”,如果数组无序(比如 [3,1,5,2]),根本没法判断目标值在左边还是右边,二分查找完全用不了。
考试考点: 选择题常考 “下列哪种情况适合用二分查找?”,答案必须是 “有序数组”(升序或降序,考试中以升序为主)。
第二步:3 步学会二分查找(以升序数组为例)
以 “有序数组 [1,3,5,7,9,11,13],找目标值 7” 为例,拆解每一步操作,对应 “查字典” 的流程,零基础也能跟着算:
三步核心流程(升序数组通用)
步骤 | 操作逻辑(大白话版) | 查字典类比 |
1. 定范围 | 定义左边界(left)=0(数组第一个元素索引)、右边界(right)= 数组长度 - 1(最后一个元素索引) | 确定字典查找范围(如 1-1000 页) |
2. 找中间 | 计算中间位置(mid)=left + (right-left)/2(避免溢出,考试常用写法) | 翻到查找范围的中间页(如 500 页) |
3. 比大小 | ① 若目标值 = mid 位置的值→找到,结束;② 若目标值 > mid 位置的值→目标在右半区,更新 left=mid+1;③ 若目标值 < mid 位置的值→目标在左半区,更新 right=mid-1 | ① 中间页就是目标字→找到;② 目标字在右边→范围改中间页 + 1 到右边界;③ 目标字在左边→范围改左边界到中间页 - 1 |
重复步骤 2-3,直到 left>right(没找到目标值)或找到目标值。
实操示例:在 [1,3,5,7,9,11,13] 中找 “7”
数组长度为 7,元素索引 0-6(left=0,right=6),一步步演示:
1.第一次循环:
- mid = 0 + (6-0)/2 = 3(中间索引 3,对应值 7);
- 目标值 7 == mid 值 7→找到目标!位置在索引 3。
结果:仅 1 次就找到目标值,比顺序查找(需要找第 4 个元素)快得多。
拓展示例:找 “9”(目标值在右半区)
同样数组 [1,3,5,7,9,11,13],找目标值 9:
1..第一次循环:
- mid=3(值 7),9>7→目标在右半区,更新 left=3+1=4(新范围 4-6);
2.第二次循环:
- mid=4 + (6-4)/2 = 5(值 11),9<11→目标在左半区,更新 right=5-1=4(新范围 4-4);
3.第三次循环:
- mid=4 + (4-4)/2 =4(值 9),9==9→找到目标!位置在索引 4。
结果:3 次找到目标值。
特殊情况:找 “8”(没找到目标值)
数组 [1,3,5,7,9,11,13],找目标值 8:
- 第一次循环:mid=3(7),8>7→left=4(范围 4-6);
- 第二次循环:mid=5(11),8<11→right=4(范围 4-4);
- 第三次循环:mid=4(9),8<9→right=3(范围 4-3,此时 left>right);
结果:left>right,说明数组中没有 8,查找结束。
第三步:考试高频考点(必记!)
零基础不用记完整代码,只要掌握这 3 个考点,就能应对 90% 的考题:
考点 1:二分查找的前提(每年考)
必须是 “有序数组”(升序或降序),如果题目中数组无序,要先排序再用二分查找(但排序会改变原数组,考试中一般直接给有序数组)。
真题示例(2023 上午第 45 题):下列数据结构中,适合使用二分查找的是?
A. 无序数组 B. 有序链表 C. 有序数组 D. 栈
解析: 二分查找需要快速定位中间元素,链表无法直接找中间元素,栈和无序数组不满足前提,答案 C。
考点 2:中间位置 mid 的计算(代码补全常考)
考试中常用 “mid = left + (right - left)/2”,而不是 “mid = (left + right)/2”—— 因为当 left 和 right 很大时,(left+right) 可能溢出(比如 left=2¹⁰,right=2¹⁰,相加超过整数范围),前者能避免溢出。
代码片段(Java 示例):
int left = 0;
int right = arr.length - 1;
while (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; // 没找到考点 3:查找次数计算(选择题常考)
查找次数 =“缩小范围的次数”,最多不超过 “log₂n +1”(n 是数组长度,log₂n 取整数)。比如 n=7(示例数组),log₂7≈2.8,最多 3 次(如找 9 用了 3 次);n=1000,log₂1000≈10,最多 10 次。
真题示例(2022 上午第 46 题):对长度为 16 的有序数组进行二分查找,最多需要多少次就能确定目标值是否存在?
A. 4 B. 5 C. 6 D. 7
解析: log₂16=4,最多需要 4+1=5 次(或直接想 2⁴=16,4 次能缩小到 1 个元素,第 5 次判断是否相等),答案 B。
零基础避坑:2 个常见错误(别踩!)
- 循环条件写错:循环条件是 “left <= right”,不是 “left < right”—— 前者会检查最后一个元素(如找 9 时,最后范围 4-4 会进入循环),后者会漏掉最后一个元素;
- 更新边界时漏加 / 漏减 1:目标值 > mid 值时,更新 left=mid+1(不是 left=mid);目标值 < mid 值时,更新 right=mid-1(不是 right=mid)—— 否则会导致范围无法缩小,陷入死循环(比如找 7 时,若 left=mid,会一直停在 mid=3)。
真题练手:2 道题带你秒会
1.(2023 上午第 45 题)下列关于二分查找的说法,正确的是?
A. 二分查找可以在无序数组中使用
B. 二分查找的时间复杂度是 O (n)
C. 二分查找每次将查找范围缩小一半
D. 二分查找不需要判断目标值与中间值的大小
解析: A(需有序数组)、B(时间复杂度 O (log₂n))、D(需要比较大小)错误;C(每次缩小一半范围)正确,答案 C。
2.(2021 上午第 47 题)在有序数组 [2,5,8,12,16,23,38,56,72,91] 中查找 23,第几次查找时会找到目标值?
A. 2 B. 3 C. 4 D. 5
解析: 步骤:① left=0,right=9→mid=4(16),23>16→left=5;② mid=5+(9-5)/2=7(56),23<56→right=6;③ mid=5+(6-5)/2=5(23)→找到,共 3 次,答案 B。
总结:1 句口诀 + 3 步模板(直接背!)
- 口诀:“有序数组用二分,中间比较定左右,left 加 1 右减 1,范围缩到找到止”;
- 3 步模板(升序数组):
① 定范围:left=0,right = 数组长度 - 1;
② 找中间:mid=left+(right-left)/2;
③ 比大小:等于找着,大了左加 1,小了右减 1,重复到 left>right。
通过 “查字典” 的类比,二分查找的逻辑会变得非常直观,后续复习时拿 2-3 个有序数组练手,就能熟练掌握,考试遇到这类题再也不用慌。
