多种二分查找

文章目录

二分查找

常规实现

java 复制代码
public static int binarySearch(int[]a,int target)
{
    int i=0,j=a.length-1;
    while(i<=j)
    {
        int m=i+((j-i)>>>1);
        if(target<a[m])
        {
            j=m+1;
        }
        else if(a[m]<target)
        {
            i=m-1;
        }
        if(target==a[m])
        {
            return m;
        }
    }
    return -1;
}

此时i和j所对应的元素都要参与比较运算,故循环条件为i<=j

改动版

java 复制代码
public static int binarySearch(int[]a,int target)
{
    int i=0,j=a.length;
    while(i<j)
    {
        int m=i+((j-i)>>>1);
        if(target<a[m])
        {
            j=m;
        }
        else if(a[m]<target)
        {
            i=m-1;
        }
        if(target==a[m])
        {
            return m;
        }
    }
    return -1;
}

**此时j表示边界,j指向的并不是查找目标,故循环条件为i<j,且j=m

平衡版

改进之前二分查找左边和右边所用时间不一样的情况

特点:左闭右开的区间,i指向的可能是目标,而j指向的不是目标
不在循环内找出,等循环范围只剩i时,在循环外面比较ai与target

java 复制代码
public static int binarySearch(int[]a,int target)
{
    int i=0,j=a.length;
    while(1<j-i)
    {
        int m=i+((j-i)>>>1);
        if(target<a[m])
        {
            j=m;
        }
        else
        {
            i=m;
        }

    }
    if(target==a[i])
    {
        return i;
    }
    return -1;
}

java中直接用Arrays类下的binarySearch方法进行查找,如果找到了返回目标的索引,没找到返回-(插入位置索引+1)

有重复元素时查找与目标相等的最靠左的索引

java 复制代码
public static int binarySearch(int[]a,int target)
{
    int i=0,j=a.length-1;
    while(i<=j)
    {

        int m=i+((j-i)>>>1);
        if(target<=a[m])
        {
            j=m-1;
        }
       else
        {
           i=m+1;
        }
    }
  return i;
}

找到最右边的元素

java 复制代码
public static int binarySearch(int[]a,int target)
{
    int i=0,j=a.length-1;
    while(i<=j)
    {

        int m=i+((j-i)>>>1);
        if(target<a[m])
        {
            j=m-1;
        }
        else if(a[m]<=target)
        {
            i=m+1;
        }
    }
    return i-1;
}
相关推荐
秋饼2 小时前
JDK 27 企业级 AI 服务落地实战:G1 默认、紧凑对象头、后量子 TLS 与 JFR 脱敏全解析
java·ai·技术分享·后端开发
卓怡学长3 小时前
w176基于SpringBoot的医院管理系统
java·spring boot·spring·maven·intellij-idea
lemon_sjdk3 小时前
ObjectProperty
java·开发语言·算法
hh9503 小时前
Agent Plan x DeepSeek Harness:Agent 供应链安全与第三方插件审计
java·开发语言·安全·agent plan·adg成都社区·adg社区
吴声子夜歌3 小时前
Java面试——HBase原理及应用
java·面试·hbase
浪兎兎3 小时前
【Java Web】Servlet + JSP 笔记
java·前端·servlet
吴声子夜歌4 小时前
Java面试——ElasticSearch原理及应用
java·面试·es
lhldsg4 小时前
家政派单系统开发实战:从需求分析到智能调度全流程指南
java·junit·小程序·uni-app·需求分析
吴声子夜歌4 小时前
Java面试——Spring原理及应用(一)
java·spring·面试
灰阳阳4 小时前
Docker-数据卷命令解析
java·docker·eureka