二分法查找数字在数组中的索引,确定数字对应的索引
场景:
一组数字类型的数据,给出一个数字,求出数字对应的索引
例如:
int[] arr=new int[]{1,2,3,4,10,20,30,50,90,100}
我们要求55对应的索引位置。
假设arr数组中存储是数字范围的起始值(按范围求索引也可以应用此算法场景)
那么索引对值的表格为:
索引 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
值 | 1 | 2 | 3 | 4 | 10 | 20 | 30 | 50 | 90 | 100 |
·
我们使用二分法来求出55对应应该所在索引位置
一、实例解析
二分法变种算法如下所示
int SearchInd(long[] ipArray, int start, int end ,long vl) //(二分法) { int middle = (start + end) / 2; if (middle == start) return middle; else if (vl < ipArray[middle]) return SearchInd(ipArray, start, middle, vl); else return SearchInd(ipArray, middle, end, vl); }
运行过程如下所示:
1-10:middle=5 55>arr[5]
5-10:middle=7 55>arr[7]
7-10:middle=8 55>arr[8]
8-10:middle=9 55<arr[9]
8-9:middle=8 Statr=middle
return middle;
得到了正确的结果55在50-90之间,那么他在数组中的位置就是8
5次递归后得到正确结果,如果使用遍历的话需要8次才能得到索引位置。
于是我们得出了这样的结论:
在由小到大的有序数字队列中,要查找的值 vl >arr[middle] 则应从 middle-->End之间继续查找,反之则从Statr-middle中查找vl
也可以说成,要查找的值 vl<arr[middle] 则应从Statr-middle之间查找,反之则从middle-End之间查找vl
二、二分法介绍
二分法使用参考 https://www.cnblogs.com/wanglog/p/6650695.html
三、标准算法
int SearchInd(long[] ipArray, int start, int end, long key) //(二分法) { if (start <= end) { int middle = (start + end) / 2; if (key < ipArray[middle]) { return SearchInd(ipArray, start, middle - 1, key); } else if (key > ipArray[middle]) { return SearchInd(ipArray, middle + 1, end, key); } else { return middle; } } return -1; }
int SearchInd(long[] ipArray, int start, int end, long key) //(二分法) { while (start <= end) { int middle = (start + end) / 2; if (key < ipArray[middle]) { end = middle-1; } else if (key > ipArray[middle]) { start = middle + 1; } else { return middle; } } return -1; }
这两种写法要求 key必须在 数组中时存在的
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
2016-05-17 在使用 HttpWebRequest Post数据时候返回 400错误