二分查找法图解

本文详细介绍了二分查找算法的基本实现,包括在有序数组中查找单个元素的情况及找到多个相同元素时如何获取其所有索引。二分查找算法在查找过程中通过不断缩小搜索范围,提高了效率。文章提供了两种不同场景下的代码实现,对于找到的目标数,一种返回单个索引,另一种则返回所有匹配索引的集合。
摘要由CSDN通过智能技术生成

        一、找到(只能返回1个索引)的情况:

 

 

         没有找到的情况:

         总结:1.这个数组需要事先排好序才能进行

                     2.根据目标数与arr[mid]大小情况来判断递归的方向

                     3.终止递归的条件:

                                3.1:找到了对应数。返回mid就行

                                3.2:查无此数。left>right出现

代码实现:

/**
     *
     * @param array:待查找的数组
     * @param target:目标数
     * @param left:左索引
     * @param right:右索引
     * 如果找到返回下标,没有找到就返回-1
     */
    public static int binarySearch(int[] array,int target,int left,int right){
        //left>right时递归结束,没找到对应值
        if (left>right){
            return -1;
        }

        //定义中间数的索引
        int mid = (left + right) / 2;

        if (target == array[mid]){
            return mid;
        }else if (target < array[mid]){//满足了向左递归的情况
           return binarySearch(array,target,left,mid-1);
        } else {//向右递归
            return binarySearch(array,target,mid+1,right);
        }
    }

        

         二、找到(能返回多个索引)的情况:

如果我们要找的数组中存在多个目标数,我们可以拿一个集合ArrayList<Integer>记录所有索引。

稍微改动一下数组的数字:

 

 

 

代码实现:

 public static ArrayList<Integer> binarySearch2(int[] array, int target, int left, int right){
        //left>right时递归结束,没找到对应值
        if (left>right){
           return new ArrayList<Integer>();
        }

        //定义中间数的索引
        int mid = (left + right) / 2;

        if (target == array[mid]){
            ArrayList<Integer> list = new ArrayList<>();
            //如果找到了这个数字,分别向他的左边右边寻找还有无相同的数
            list.add(mid);
            //向左边
            int lTemp = mid - 1;
            while (true){
                if (lTemp < 0 || array[lTemp] != target){//只会连着出现,因为是排序了
                    break;//这样就是没出现
                }
                list.add(lTemp--);//ltemp左移
            }
            //向左边
            int rTemp = mid + 1;
            while (true){
                if (lTemp > array.length-1 || array[rTemp] != target){//只会连着出现,因为是排序了
                    break;//这样就是没出现
                }
                list.add(rTemp++);//rtemp右移
            }

            return list;
        }else if (target < array[mid]){//满足了向左递归的情况
            return binarySearch2(array,target,left,mid-1);
        } else {//向右递归
            return binarySearch2(array,target,mid+1,right);
        }
    }

只需要在找到目标数的部分做对应修改就好,其余的大致一样。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值