二分查找思路实现

二分查找是一种很常见的查找算法,重要的是边界的处理和循环的起止条件

  1. 使用二分查找的话,首先接收的数组一定是有序的。
  2. 确定边界。在头一次循环中,左边界也就是索引下标为0的位置,右边界是数组的长度-1.
  3. 确定循环起止条件。当左边界 l <= r 右边界时,循环成立。此时的l和r类似于双指针,指向数组的位置。在循环过程中没有找到目标值时,根据目标值和m的大小,再次确定左右边界的选取范围。当中间值 a[m] == target 时,即找到目标值,返回目标值下标m。而当 l > r 时 也就代表着未找到数据,返回 -1;
  4. 注意点:在求m的大小时,可能会出现数据溢出的情况。正常情况 m = (l + r) / 2 向下取整。为了避免数据溢出(当数组长度很大时,并且数据处于数组中的右部分,有可能会出现数据溢出),我们可以使用右移一位的方式(位运算,等价于除以2,前提是正整数)。还可以使用 m = l + (r - l) / 2 ; 的方式避免数据过大造成溢出
  5. 代码如下:
java 复制代码
public static int binarySearch(int[] a, int t) {
        int l = 0, r = a.length - 1, m;
        while (l <= r) {
            m = (l + r) / 2;
            //m = (l + r) >>> 1;
            //m = l + (r - l) / 2;
            if (a[m] == t) {
                return m;
            } else if (a[m] > t) {
                r = m - 1;
            } else {
                l = m + 1;
            }
        }
        return -1;
    }
相关推荐
2401_857617626 分钟前
SpringBoot校园资料平台:开发与部署指南
java·spring boot·后端
quokka569 分钟前
Springboot 整合 logback 日志框架
java·spring boot·logback
计算机学姐14 分钟前
基于SpringBoot+Vue的在线投票系统
java·vue.js·spring boot·后端·学习·intellij-idea·mybatis
penguin_bark20 分钟前
69. x 的平方根
算法
这可就有点麻烦了30 分钟前
强化学习笔记之【TD3算法】
linux·笔记·算法·机器学习
救救孩子把31 分钟前
深入理解 Java 对象的内存布局
java
落落落sss33 分钟前
MybatisPlus
android·java·开发语言·spring·tomcat·rabbitmq·mybatis
苏宸啊36 分钟前
顺序表及其代码实现
数据结构·算法
万物皆字节39 分钟前
maven指定模块快速打包idea插件Quick Maven Package
java
lin zaixi()39 分钟前
贪心思想之——最大子段和问题
数据结构·算法