Java递归二分查找的核心是每次缩小一半搜索范围,通过正确传递左右边界、防止整型溢出(用left+(right-left)/2)、设置left>right为终止条件,并在匹配时返回mid,否则递归搜索左或右子区间。

Java 中二分查找的递归实现,核心是每次将搜索范围缩小一半,并通过递归调用处理子区间。关键在于正确传递左右边界、避免越界、以及设置清晰的递归终止条件。
递归二分查找的基本结构
递归版本需要显式传入 left 和 right 下标,表示当前搜索区间。方法每次计算中点 mid = left + (right - left) / 2(防止整型溢出),再根据目标值与 arr[mid] 的大小关系决定向左或右子区间递归。
- 若
arr[mid] == target,直接返回mid - 若
target ,递归搜索 <code>[left, mid - 1] - 若
target > arr[mid],递归搜索[mid + 1, right] - 若
left > right,说明未找到,返回-1
完整可运行的递归实现
以下是一个标准、安全的递归二分查找方法(假设数组升序排列):
public static int binarySearch(int[] arr, int target) {
if (arr == null || arr.length == 0) return -1;
return binarySearch(arr, target, 0, arr.length - 1);
}
<p>private static int binarySearch(int[] arr, int target, int left, int right) {
if (left > right) return -1;</p><pre class="brush:php;toolbar:false;">int mid = left + (right - left) / 2;
if (arr[mid] == target) {
return mid;
} else if (target <p>}</p>注意:对外提供一个简洁入口方法,隐藏初始边界参数;内部递归方法为私有,确保调用安全。
常见易错点提醒
写递归二分时容易出问题的地方:
-
边界更新错误:比如写成
mid而不是mid - 1或mid + 1,会导致无限递归或漏查 -
溢出风险:直接用
(left + right) / 2在大索引下可能整型溢出,应使用left + (right - left) / 2 -
初始调用遗漏检查:未判空或数组长度为 0,可能触发
ArrayIndexOutOfBoundsException - 递归深度:虽然二分查找递归深度仅为 O(log n),对一般数据规模无压力,但极端情况(如上亿元素)可考虑迭代避免栈溢出
如何验证逻辑是否正确
建议用几组典型输入快速验证:
- 空数组:
binarySearch(new int[]{}, 5)→ 返回-1 - 单元素:
binarySearch(new int[]{3}, 3)→ 返回0;查不到则返回-1 - 目标在开头/中间/末尾:
[1,3,5,7,9]查1、5、9 - 目标不存在:
binarySearch([2,4,6], 5)→ 返回-1
不复杂但容易忽略细节,把边界和终止条件想清楚,递归二分就非常稳健。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











