使用二分查找算法查找一个有序数组中指定数的索引
import java.util.Scanner;
public class BinarySearch {
static int i = 1; //这里自定义的i是为了方便下面输出每一步查找的下标、上标、中间数 ,无关紧要 可以不要
public static void main(String[] args) {
int[] arr = {1,1,1,1, 5, 8, 8, 9, 25, 66, 90, 100,100}; //定义一个数组 注意的是,二分数组必须是有序排列的
int target = new Scanner(System.in).nextInt(); //输入要查找的目标数
find(arr, 0, arr.length, target); //将数组arr,下标0,上标数组的长度,要查找的目标数传给find函数
}
//find查找函数
private static void find(int[] arr, int low, int high, int target) {
int middle = (low + high) / 2; //每一次从中间搜索,定义middle为下标和上标和的一半
//middle的计算方式有很多种,这里我用的是自己比较熟悉的一种 相加取中间值
//为了方便查看每一步的运行结果,这里输出打印一下下标、上标、middle和middle索引对应的值
System.out.println((i++) + ": low->" + low + " high->" + high + " middle->" + middle + " arr[middle]->" + arr[middle]);
//二分查找核心思想 重要代码
if (low <= high) { //递归的结束标志,如果当下标low>上标high时,则证明要查找的数不在二分数组中。
if (arr[middle] == target) { //如果arr[middle]==target 则查找成功
System.out.println("search successful:" + middle); //输出查找数在数组中的索引
}
if (arr[middle] > target) {
find(arr, low, middle - 1, target);
//如果arr[middle] > target 则证明要查找的数只能在arr[middle]的左边,及数组索引为low~middle-1 之中
//递归调用find数组,下标low不变,上标high变为middle - 1
}
if (target > arr[middle]) {
find(arr, middle + 1, high, target);
//如果arr[middle] < target 则证明要查找的数只能在arr[middle]的右边,及数组索引为middle+1~high 之中
//递归调用find数组,上标high不变,下标变位middle+1
}
} else {
System.out.println("search error!"); //low>high时 查找失败
}
}
}
注:
- 查找数组必须是有序排列,不然会失败
- 当有数组中有多个相同的数时,返回的索引是随机的 比如上面数组中,如果前面是2个1返回的索引是0 ,3个1返回的索引是2,4个1返回的索引也是2。
- 二分查找的时间复杂度是O(lgN) 空间复杂度是O(1)。
以上都是闲来无聊写的,有错的地方还请各位大佬指正