二分查找
主要针对的是“有序数组”中查找某个特定元素。
1、二分查找的思想:主要针对的是有序数组,要充分利用数组有序的特性,要是遍历查找,时间复杂度是O(n),就浪费了数组的有序性。其思想就是,每次查找对比的元素都是数组的中间元素,通过比较中间元素和目标元素的大小,进一步的缩小范围,每次比较的范围都缩小为原来的一半。可以用递归的思想来实现。
2、时间空间复杂度:时间复杂度 O(logn),空间复杂度O(1)
3、代码:
递归实现:
int binarysearch(int array[], int low, int high, int target) { if (low > high) return -1; int mid = low + (high - low) / 2; if (array[mid] > target) return binarysearch(array, low, mid - 1, target); if (array[mid] < target) return binarysearch(array, mid + 1, high, target); return mid; }
循环实现:
int bsearchWithoutRecursion(int a[], int key) { int low = 0; int high = a.length - 1; while (low <= high) { int mid = low + (high - low) / 2; if (a[mid] > key) high = mid - 1; else if (a[mid] < key) low = mid + 1; else return mid; } return -1; }
4、应用
二分查找也可以用来查找含有重复数字的排序数组的first数字或last数字。
//二分法查找第一个数字 public static int getFirstNumberIndex(int[] array, int k) { int result = -2; int start = 0; int end = array.length - 1; while (start <= end) { int mid = (start + end) / 2; //若中间数字大于k,在前半部分查找 if (array[mid] > k) { end = mid - 1; } else if (array[mid] < k) { start = mid + 1; } else if (array[mid] == k) { //用短路与去判断mid>0,防止ArrayIndexOutOfBoundsException if (mid > 0 && array[mid - 1] != k || mid == 0) { result = mid; break; } else { end = mid - 1; } } } return result; }
分类:
算法
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)