Java 二分查找
Java著名,高效并且应用广泛的二分查找算法.
package 二分查找; import java.util.Arrays; public class BinarySearch { public static void main(String[] args) { int[] a = { 123, 423, 21, 321, 12, 341, 3213, 42 }; // The array must be orderly Arrays.sort(a); for(int x : a) { System.out.print(x+" "); } System.out.println(); int rank = rank(123, a); System.out.println(rank); } public static int rank(int key, int[] a) { int lo = 0; int hi = a.length - 1; while (lo <= hi) { // 被查找的键要么不存在,要么必然存在于a[lo...hi]之中. int mid = lo + (hi - lo) / 2; if (key < a[mid]) { // 如果key小于a数组的一半大小下标中的数据,那么就可以让最大下标hi减小范围至mid-1 hi = mid - 1; } else if (key > a[mid]) { // 如果key大于a数组下标的一半中的数据,那么最小下标从mid基础上+1 lo = mid + 1; } else { return mid; } } //不存在返回-1 return -1; } }
该算法是由静态方法rank()实现的,它接受一个整数键key和一个已经有序的int数组作为参数.如果该键存在于数组中则返回它的索引,否则返回-1.
算法使用两个变量lo和hi,并保证如果键key在数组中则它一定在a[lo...hi]中,然后方法进入一个循环,不断将数组的中间键(mid)和被查找的键比较.
如果被查找的键key等于a[mid],则返回mid;否则算法就将查找范围缩小一半,如果被查找的键key小于a[mid]就将最大下标lo缩减至mid-1(在数组左半边-1继续查找)
如果被查找的键key大于a[mid]就继续在右半边查找(lo最小下标升级为mid+1),算法找到被查找的键key或是查找范围为空时该过程结束.
二分查找之所以快是因为它只需检查很少几个条目(相对于数组的大小)就能够找到目标元素(或者确认目标元素不存在).
https://www.processon.com/view/link/5b2308e4e4b02539617ea55c <图示大图
作者:ukyo--碳水化合物
出处:https://www.cnblogs.com/ukzq/p/9185818.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端