二分查找的三种写法
二分查找概念
二分查找:是一种在有序数组中查找某一特定元素的搜索算法。
这种搜索算法每一次比较都使搜索范围缩小一半。
写法一
根据定义:
public static int binary(int[] a,int data)
{
int mi=0,ma=a.length-1,mid;
while(mi<=ma)
{
mid=(mi+ma)/2;
if(a[mid]>data) ma=mid-1;
else if(a[mid]<data) mi=mid+1;
else return mid;
}
return -1;
}
写法二
对于写法一而言,第8行代码会出现bug:mid=(min + max)/2;
这句代码在 min 和 max 很大的时候,会出现溢出的情况,从而导致数组访问出错。
进行改进:将加法变成减法。
public static int binary(int[] a,int data)
{
int min=0,max=a.length-1,mid;
while(min<=max)
{
mid=min+(max-min)/2; // 防止溢出
if(a[mid]>data) max=mid-1;
else if(a[mid]<data) min=mid+1;
else return mid;
}
return -1;
}
写法三
利用位运算(官方的二分搜索法的实现写法)
public static int binary(int[] a,int data)
{
int mi=0,ma=a.length-1,mid;
while(mi<=ma)
{
mid=mi+((ma-mi)>>1); // 无符号位运算符的优先级较低,先括起来
if(a[mid]>data) ma=mid-1;
else if(a[mid]<data) mi=mid+1;
else return mid;
}
return -1;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」