数据结构与算法《二分查找》

 数据结构与算法(java)《二分查找》

  1. 基本二分查找
    
    public class BinarySearch {
        /**
         * 1.定义一个有序数组,
         * 2.定义两个变量i,j
         * 3.定义一个待查找的数
         * 4.查到返回索引的值,查不到返回-1
         */
        public static int binarySearchBasic(int[] a,int target) {
            //定义两个指针,i指向头指针,j指向尾指针
            int i = 0;
            int j =a.length-1;
            //进行判断循环
            while (i<=j){
                int m=(i+j)/2; //向下取整,int类型会自动取整,有漏洞,建议使用右移
                if (a[m]<target){
                    i=m+1;//在目标左边
                }else if (a[m]>target){
                    j=m-1;//在目标右边
                }else{
                    return m; //找到了,返回索引
                }
            }
            return -1;//没有找到
        }
    
        //测试
        public static void main(String[] args) {
            //定义一个数组
            int[] i={7,13,21,30,38,44,52,53};
            int target =21;
            int searchBasic = binarySearchBasic(i, target);
            System.out.println(searchBasic);
    
        }
    

2.改动版二分查找

public static int binarySearchBasic1(int[] a,int target) {
    //定义两个指针,i指向头指针
    int i = 0;
    int j =a.length; //此时的j不指向队尾,不参与比较,只是定义一个范围
    //进行判断循环
    while (i<j){
        int m=(i+j)/2; //向下取整,int类型会自动取整,有漏洞,建议使用右移
        if (a[m]<target){
            i=m+1;//在目标左边
        }else if (a[m]>target){
            j=m;//在目标右边
        }else{
            return m; //找到了,返回索引
        }
    }
    return -1;//没有找到
}

3.遇到的问题:

3.1 为什么是i<=j而不是i<j? 

答:i==j意味着i,j它们指向的元素也会参与比较。

3.2 (i+j)/2有没有问题?

 int maxValue = Integer.MAX_VALUE-1;

 int i1=0; 

int m=(maxValue+i1)/2; 

System.out.println(m);//此时的值为1073741823

 int i2 = (m + maxValue)/2; 

System.out.println(i2);//此时的值为负数,不符合要求

因为Java有符号数,第一个二进制数为1的话,表示为负,建议使用右移:m=(i+j)>>>1;

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值