多种二分查找

文章目录

二分查找

常规实现

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时,在循环外面比较a[i]与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;
}
相关推荐
白露与泡影1 天前
Java关键字解析之final:不可变的本质、设计哲学与并发安全
java·开发语言·安全
Li_7695321 天前
IDEA 中 maven 图标失踪解决措施
java·maven·intellij-idea
月明长歌1 天前
【码道初阶】【LeetCode 150】逆波兰表达式求值:为什么栈是它的最佳拍档?
java·数据结构·算法·leetcode·后缀表达式
想用offer打牌1 天前
一站式了解长轮询,SSE和WebSocket
java·网络·后端·websocket·网络协议·系统架构
C雨后彩虹1 天前
最大数字问题
java·数据结构·算法·华为·面试
梦里不知身是客111 天前
tomcat作用和功能以及默认端口号
java·tomcat
码界奇点1 天前
基于SpringBoot与Vue3的多租户中后台管理系统设计与实现
java·spring boot·后端·spring·车载系统·毕业设计·源代码管理
长安城没有风1 天前
在 IntelliJ IDEA 中高效使用 Git 的实用指南
java·git·intellij-idea
Code blocks1 天前
SpringBoot从0-1集成Netty实现自定义协议开发
java·spring boot·后端
武子康1 天前
Java-195 RabbitMQ BlockingQueue 手搓“消息中间件”雏形:生产者-消费者模型到企业级 MQ 差在哪
java·分布式·架构·消息队列·rabbitmq·java-rabbitmq·mq