java实现二分查找

文章目录

 1、什么是二分查找?

 2、二分查找的优缺点是什么?

 3、二分查找的前提:

 4、二分查找原理解析(java代码实现)

5、 图解说明


 1、什么是二分查找?

二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。(引用自百度百科

 2、二分查找的优缺点是什么?

二分查找(折半查找)算法,是数据结构中一个典型的算法,它的查询速度是非常快的,比较次数少,平均性能好。但是其也有缺点,缺点就是二分查找必须有个前提就是数组是有序的,而且插入删除都比较困难。

 3、二分查找的前提

必须是一个有序的序列。

 4、二分查找原理解析(java代码实现)

 首先我们定义一个数组

 int[] arr = {11, 22, 33, 44, 55, 66, 77};

二分查找是由两个变量:left索引和right索引控制查询范围,通过不断的折半范围来缩小查询区间实现查询数据。下面通过java语言来实现二分查找。

首先主方法内定义好数组arr,并且定义需要查询的值(这个值可以通过Scanner对象在控制台获取,为了演示我就直接赋值了),然后输出结果。

 public static void main(String[] args) {
    
        int[] arr = {11, 22, 33, 44, 55, 66, 77};
        //定义需要查询的值
        int select_value = 66;
        int index= getIndex(arr,select_value);
        System.out.println("查询值所对应的索引为:" + index);
    }

 接下来就是定义一个方法用来实现二分查找了,这里我定义了一个有参有返回值的方法getIndex,里面传递了两个参数,一个为数组arr,另一个就是需要查询的值select_value。

public static int getIndex(int[] arr,int select_value) {

        //初始化最小值的索引为0
        int left = 0;
        //初始化最大值的索引为arr.length-1
        int right = arr.length - 1;

        //首尾相加再除以2得出中间索引
        int mid = (left + right) / 2;

        while (left<=right) { //确保程序不会重复查询,不会越界
            if (select_value > arr[mid]) {
                //如果查询的值比中间值大,则往右边区域找,就把最小索引改为中间索引右移一位
                left = mid + 1;
            } else if (select_value < arr[mid]) {
                //如果查询的值比中间值小,则往左边区域找,就把最大索引改为中间索引左移一位
                right = mid - 1;
            } else {
                //剩余的情况就是查询到了结果,那么就直接返回索引。
                return mid;
            }
            mid = (left + right) / 2;
        }
        //没有查询到,则返回-1
        return -1;
    }

5、 图解说明

下面我就用图解的形式来分析一下具体的实现原理,纯手工制作,图丑大家勿喷0.0。

首先我们定义一个left和right变量,对应的就是数组的索引0和索引arr.length-1。

 通过(left + right) / 2折半计算,我们算出mid=3的(java中int类型相除得出还是int类型,原本是3.5的值会被转变为int型变为3)。 此时arr[mid]的值为44,并不是我们寻找的66,通过比较66是比44大的,就会进入第一个if语句里面。

 为了缩小范围进行查找,我们需要把left索引移到中间索引的右边,而right索引保持不变,此时原本索引0-6的范围瞬间缩小到了4-6,距离我们的目标66也越来越近。

 我们此时再次进行(left + right) / 2折半计算,得到mid=5,此时mid索引就会移到到索引为5的位置,这时while循环并没有结束,再次while循环接着判断,发现这次arr[mid]的值刚好就是我们目标寻找的值66,那么就直接返回mid值为5,主方法里面通过调用getIndex方法获取到5,输出到控制台。

 输出结果

 

 这是目标值在右边的情况,左边的情况与右边原理相同,不同的是保持left位置不变,让right索引移到了中间索引mid的左边mid-1,这样就可以在左边区域进行寻找目标值。

 欢迎大家指出不足的地方,我看到会在第一时间补充。

  • 21
    点赞
  • 91
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值