算法:二分查找法(处理有序数组时可用)

处理边界索引指向:保证循环不变量,虽然left和right的值在不断变化,但待查找的target在[l…r]的范围里的声明是不变的,控制边界保证循环不变量

 public  int binarySearch(E arr[], E target, int n) {
         int left=0;
         int right=n-1;//在[left..right]的范围里寻找target
         while(left<=right) {//没有可查找内容时跳出循环;当left==right时,区间[left...right]仍然有可查找的元素,
             // 要继续查找下去,所以循环条件设置成left<=right
             int mid = left+(right-left)/2;
             if(arr[mid].compareTo(target)==0)
                 return mid;
             else if (arr[mid].compareTo(target) < 0)//更新左边界
                 left= mid + 1;//根据left的定义确定更新值,target在[left..right]的范围里
             //arr[mid]不是要寻找的target,target在[mid+1...r]中
             //不需要在待查找范围中包含肯定不是target的索引
             else right = mid - 1;//target<arr[mid]
             //target在[l...mid-1]中
         }
         //没有任何区间含有要查找的target
         return -1;

    }

    public  int binarySearch2(E arr[], E target, int n) {
        int left=0;
        int right=n;//在[left..right)的范围里寻找target
        while(left<right) {//没有可查找内容时跳出循环;当left==right时,区间[left...right)依然是无效的,如[42,42),[42,43)有效
            // 要继续查找下去,所以循环条件设置成left<=right
            int mid = left+(right-left)/2;
            if(arr[mid].compareTo(target)==0)
                return mid;
            else if (arr[mid].compareTo(target) < 0)//更新左边界
                left= mid + 1;//根据left的定义确定更新值,target在[left..right)的范围里
                //arr[mid]不是要寻找的target,target在[mid+1...r)中
                //不需要在待查找范围中包含肯定不是target的索引
            else right = mid;//target<arr[mid]
            //target在[l...mid-1]中,right是开区间,更新为mid,如果更新为mid-1,漏掉了一个可能是target的arr[mid-1]
            //target在[l..mid)中
        }
        //没有任何区间含有要查找的target
        return -1;

    }

在这里插入图片描述

在这里插入图片描述

移动零算法优化:基于特殊情况进行优化,避免多余操作

在这里插入图片描述

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值