【详解】二分查找(含java实现代码)

需求

在这里插入图片描述

算法描述

在这里插入图片描述

算法步骤

在这里插入图片描述

注意事项

在这里插入图片描述

算法实现

package Basic;

public class BinarySearch{

    public static int binarySearchBasic(int a[],int target) {
        int i=0,j=a.length-1;
        while(i<=j) {           //注意这里的判断条件
            int m=(i+j)>>>1;	//注意不能直接用除法
            if(target==a[m]) {
                return m;
            }
            else if(target<a[m]) {
                j=m-1;
            }
            else if(a[m]<target) {
                i=m+1;
            }

        }
        return -1;

    }
}

测试代码如下:

package Basic;

import org.junit.Assert;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import Basic.BinarySearch.*;

import static Basic.BinarySearch.binarySearchBasic;

public class TestBinarySearch {
    @Test
    @DisplayName("binarySearchBasic 找到目标值")
    public void test1(){
        int[] a={7,9,11,17,19,23,34};//升序排列的数组
        //断言测试
        Assert.assertEquals(0,binarySearchBasic(a,7));
        Assert.assertEquals(1,binarySearchBasic(a,9));
        Assert.assertEquals(2,binarySearchBasic(a,11));
        Assert.assertEquals(3,binarySearchBasic(a,17));
        Assert.assertEquals(4,binarySearchBasic(a,19));
        Assert.assertEquals(5,binarySearchBasic(a,23));
        Assert.assertEquals(6,binarySearchBasic(a,34));
    }
    @Test
    @DisplayName("binarySearchBasic 没找到目标值")
    public void test2(){
        int[] a={7,9,11,17,19,23,34};//升序排列的数组
        //断言测试
        Assert.assertEquals(-1,binarySearchBasic(a,8));
        Assert.assertEquals(-1,binarySearchBasic(a,13));
        Assert.assertEquals(-1,binarySearchBasic(a,20));
    }

    
}

另一种版本

之前i和j是闭合区间,i和j都需要参加比较,二分查找还有另一种版本,就是左闭右开区间,j不参与比较,在原版的基础上做了三处改动

改动的原理都是因为j不参与比较,只判断[i,j)之间的值,如果[i,j)之间没有值了则查找失败

package Basic;

public class BinarySearch{

    public static int binarySearchBasic(int a[],int target) {
        //int i=0,j=a.length-1;
        int i=0,j=a.length;
        //while(i<=j) {
        while(i<j) {
            int m=(i+j)>>>1;
            if(target==a[m]) {
                return m;
            }
            else if(target<a[m]) {
                //j=m-1;
                j=m;
            }
            else if(a[m]<target) {
                i=m+1;
            }

        }
        return -1;

    }
}
  • 16
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值