二分查找一个数 java实现

使用二分查找算法查找一个有序数组中指定数的索引

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)。

以上都是闲来无聊写的,有错的地方还请各位大佬指正

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值