1.二分查找(基础版)

二分查找算法也称折半查找,是一种非常高效的工作于有序数组的查找算法。

                                                                图1-1

给一个有n(图中为8个)个元素的有序数组A,每个元素都有对应的下标,设i=0,j=n-1,m=floor[(i+j)/2],向下取整,在图中m=3,我们规定想要查找的元素如果存在则返回对应的下标,不存在则返回-1,我们假设四种情况:

第一种:查找的元素target=30,即A[m]=target,返回3。

                                                                     图1-2

第二种:查找的元素target=45,target>A[m],m左面的元素(包括m)不需要再进行比较,所以i=m+1,如图1-2所示,此时i=4,j=7,m=5,得到A[m]=target,返回坐标5。

    图1-3

第三种:查找元素target=12,target<A[m],m右面的元素(包括m)不需要再进行比较,所以j=m-1,如图1-3所示,此时i=0,j=2,m=1,即target=A[m],返回下标1。

   图1-4

第四种:查找元素target=48,target>A[m],m左面的元素(包括m)不需要再进行比较,所以i=m+1,,如图1-2所示,此时i=4,j=7,m=5,但是target仍然>A[m],继续进行查找,i=5,j=7,m=6,target<A[m],j=m-1,此时i=j=5,m=5,target>A[m],i=m+1=6,此时i>j,如图1-4所示,即未找到,结束,返回-1。

那么以上就是二分查找基础的四种情况了,接下来会用Java代码进行实现。

public class BinarySearch {


    public static void main(String[] args) {
        //定义一个数组
        int[] arr={3,12,21,30,37,45,56,63};
        //1.目标值刚好等于中间值
        System.out.println(binarySearchBasic(arr, 30));  //3
        //2.目标值大于中间值
        System.out.println(binarySearchBasic(arr, 56));  //6
        //3.目标值小于中间值
        System.out.println(binarySearchBasic(arr, 12)); //1
        //4.未找到目标值
        System.out.println(binarySearchBasic(arr, 50)); //-1
    }

    /**
     *
     * @param arr 升序的数组
     * @param target  要查找的元素值
     * @return
     */
    public static int binarySearchBasic(int[] arr,int target){
        //设置指针和初始值
        int i=0,j=arr.length-1;
        //只要在这个范围内就有值可查
        //i必须小于等于j,如果不加等于i=j会不进行查询,会漏掉一次
        while (i<=j){
              //确定中间索引mid
            int mid=(i+j)/2;
            //目标值小于中间值
            if (target<arr[mid]){
                j=mid-1;
                //目标值大于中间值
            }else if (target>arr[mid]){
                i=mid+1;
            }else {
                //找到则返回对应的索引
                return mid;
            }
        }
        //找不到则返回-1,此时i>j
        return -1;
    }
}

那么,以上就是二分查找的基础版了。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值