二分查找法
二分查找算法,也称折半搜索算法,是一种在有序数组中查找某一特定元素的搜索算法。算法思想是不断的缩小查找范围,步骤如下:
1️⃣ 确定基准:
- 选定数组的中间元素(基准值)。
- 如果数组大小为偶数,通常选择中间的 右侧元素(也可以选择左侧元素,但不影响算法效果)。
2️⃣ 分割数组:
- 将数组分成两半,基准元素作为分割点。
- 对比目标值与基准值:
3️⃣ 判断目标位置:
- 如果目标值 小于基准值,则目标值一定在数组的 左半部分,下一轮查找范围是左半部分。
- 如果目标值 大于基准值,则目标值一定在数组的 右半部分,下一轮查找范围是右半部分。
4️⃣ 重复步骤:
- 在新的查找范围内,重新计算中间元素,并继续比较,逐步缩小查找范围,直到找到目标值或范围为空(即left > right)。
相比普通的顺序查找,除了数据量很少的情况下,二分查找会比顺序查找更快,对比图如下:
function binarySearch(arr,start,end,target){ if(start > end){ return -1; } //中间值在整个数组中的位置 = 开始位置 + 当前分区的中间位置 let mid = start + Math.floor((end-start)/2) if(arr[mid] === target){ return mid; }else if(arr[mid] < target ){ //右侧查找 return binarySearch(arr,mid + 1,end,target) }else{ //左侧查找 return binarySearch(arr,start,mid - 1,target) } }
如果数组中存在重复项,而我们需要找出第一个匹配项或最后一个匹配项,实现代码如下:
function binarySearch(arr, l, r, target, findBoundary = 'first') { if (start > end) { return -1; // 未找到目标元素 } let mid = start + Math.floor((end - start) / 2); //找到时,进一步查找(第1个还是最后一个) if (arr[mid] === target) { if (findBoundary === 'first') { // 如果是查找第1个,继续向左查找,直到找到第一个匹配项 if (mid === 0 || arr[mid - 1] !== target) { return mid; // 找到第一个匹配项 } return binarySearch(arr, start, mid - 1, target, findBoundary); } else if (findBoundary === 'last') { // 如果是查找最后一个,继续向右查找,直到找到最后一个匹配项 if (mid === end || arr[mid + 1] !== target) { return mid; // 找到最后一个匹配项 } return binarySearch(arr, mid + 1, end, target, findBoundary); } } else if (arr[mid] < target) { return binarySearch(arr, mid + 1, end, target, findBoundary); // 向右查找 } else { return binarySearch(arr, start, mid - 1, target, findBoundary); // 向左查找 } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!