二分查找
二分查找原理:
又称为折半查找,元素必须是顺序存储的,按照大小有序排列.
如果元素按照升序排列,取中间位置的元素与要查找的元素比较,两者相等就表示查找元素成功;否则,按照中间位置的元素为界限,将左右的元素分成两部分,如果中间位置的元素大于要查找的元素,就在左边部分取中间位置继续查找;如果中间位置的元素小于要查找的元素,就在右边部分取中间位置继续查找;重复以上操作,直到查找到要查找的元素或者不再能分成左右两部分为止(查找不成功).
示例:
例如对于数组[11,22,33,44,55,66,77,88,99]来说,数组长度为9,数组下标为0,1,2,3,4,5,6,7,8
示例一:查找77
第一次查找:
起始数组下标为0,终止数组下标为8,中间位置数组下标为4,元素为55;
由于55<77,则在55的右侧继续查找;
第二次查找:
起始数组下标为5,终止数组下标为8,中间位置数组下标为6,元素为77;
由于77==77,查找成功;
示例二:查找17
第一次查找:
起始数组下标为0,终止数组下标为8,中间位置数组下标为4,元素为55;
由于55>17,则在55的左侧继续查找;
第二次查找:
起始数组下标为0,终止数组下标为3,中间位置数组下标为1,元素为22;
由于22>17,则在22的左侧继续查找;
第三次查找:
起始数组下标为0,终止数组下标为0,中间位置数组下标为0,元素为11;
由于11<17,则在11的右侧继续查找;
第四次查找:
起始数组下标为1,终止数组下标为0,可知这种情况是不合常理的,可以判断为查找不到;
总结:
二分查找的退出循环条件可以总结为:查找的元素与被查找的元素相等和起始下标大于终止下标;
二分查找的循环条件可以使用起始下标小于终止下标;
Java代码实现:
package com.yg.study; public class BinarySearch { public static void main(String[] args) { int[] arr= {11,22,33,44,55,66,77,88,99}; boolean flag=doSearch(arr,77); //boolean flag=doSearch(arr,17); System.out.println(flag?"查找成功":"查找失败"); //查找结果打印 } private static boolean doSearch(int[] arr,int num) { int beginIndex=0; //起始索引取数组的最小索引 int endIndex=arr.length-1; //终止索引取数组的最大索引 int middleIndex=0; //中间位置索引设置初始值 while(beginIndex<=endIndex) { //如果起始索引大于终止索引,退出循环 middleIndex=(beginIndex+endIndex)>>>1; //计算中间位置索引 if (arr[middleIndex]==num) { //查找到指定的元素 return true; }else if (arr[middleIndex]>num) { endIndex=middleIndex-1; }else { beginIndex=middleIndex+1; } } return false; //没有查找到指定的元素 } }
结果展示:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!