简介
这里有用到递归的二分算法的思路,难度对新手很大,不明白递归和二分查找的小伙子可以先看看我的其他两个文章。
连接在这里:
- Java 二分查找算法https://blog.csdn.net/ouhexie/article/details/140981942?spm=1001.2014.3001.5502
- Java 递归算法https://blog.csdn.net/ouhexie/article/details/140984060?spm=1001.2014.3001.5502
案例
我们来详细解析这段代码的每一部分。
首先呢,是我们的main方法:
public static void main(String[] args) {
// 创建数组
int[] nums = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
// 调用 binarySearch 方法进行查找,并输出结果
System.out.println("返回的索引值是:" + binarySearch(nums, 0, 0, nums.length - 1));
}
- 数组 nums:创建了一个有序数组 nums,包含 10 个整数。
- binarySearch 方法调用:调用递归的 binarySearch 方法查找目标值 0,传递参数 left 为 0 和 right 为 nums.length - 1(即 9),这是查找的初始区间。
然后binarySearch 方法
private static int binarySearch(int[] nums, int target, int left, int right) {
// 获取数组列表当中的中间索引,且防止整数溢出
int mid = left + (right - left) / 2;
if (nums == null || nums.length == 0 || left > right) {
return -1;
}
// 判断当前的中间索引是否等于目标值
if (nums[mid] == target) {
return mid;
} else if (target > nums[mid]) {
return binarySearch(nums, target, mid + 1, right); // 目标值大于中间值,递归查找右半部分
} else if (target < nums[mid]) {
return binarySearch(nums, target, left, mid - 1); // 目标值小于中间值,递归查找左半部分
}
return -1; // 如果目标值不在数组中,返回 -1
}
计算中间索引:
int mid = left + (right - left) / 2;
计算当前区间的中间索引 mid,这可以避免直接 (left + right) / 2 可能导致的整数溢出。
边界条件检查:
if (nums == null || nums.length == 0 || left > right) { return -1; }
如果数组为空、数组长度为 0,或 left 超过 right(无效区间),返回 -1。
查找目标值:
if (nums[mid] == target) { return mid; }
如果 mid 索引处的值等于目标值,返回 mid。
else if (target > nums[mid]) { return binarySearch(nums, target, mid + 1, right); }
如果目标值大于中间值,递归在右半部分查找(mid + 1 到 right)。
else if (target < nums[mid]) { return binarySearch(nums, target, left, mid - 1); }
如果目标值小于中间值,递归在左半部分查找(left 到 mid - 1)。
目标值不在数组中:
如果递归结束后没有找到目标值,返回 -1。
最终案例
/**
* @version 1.0
* @ClassName RecursiveSearch
* @Description 二分查找递归法
* @Author NanJi
* @Date 2024 - 2024/8/9 - 9:51
*/
public class RecursiveSearch {
public static void main(String[] args) {
// 创建数组
int[] nums = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
System.out.println("返回的索引值是:" + binarySearch(nums, 0, 0, nums.length - 1));
}
/**
* 递归二分查找方法
*
* @param nums 要查询的数组
* @param target 要查询的目标值
* @param left 最小下标
* @param right 最大下标
* @return 返回索引值
*/
private static int binarySearch(int[] nums, int target, int left, int right) {
// 获取数组列表当中的中间索引
int mid = left + (right - left) / 2;
if (nums == null || nums.length == 0 || left > right) {
return -1;
}
// 判断当前的中间索引是否等于目标值
if (nums[mid] == target) {
return mid;
} else if (target > nums[mid]) {
// 如果目标值大于中间值,则left等于mid+1,左边的指针等于中间值的下标加一
return binarySearch(nums, target, mid + 1, right);
} else if (target < nums[mid]) {
// 如果目标值小于中间值,则right等于mid-1,右边的指针等于中间值的下标减一
return binarySearch(nums, target, left, mid - 1);
}
return -1;
}
总结
这段代码通过递归的方式实现了二分查找算法,用于在有序数组中查找目标值。每次递归将搜索范围缩小一半,直到找到目标值或确定目标值不在数组中。由于 0 不存在于数组 nums 中,最终的输出结果是 -1。
欧了,到这里我应该解释的差不多啦,我是南极,大胆做自己,活出精彩的人生👊👊👊