二分查找

思路:
1.首先确定该数组中间的下标
mid = (left + right) / 2
2.然后让需要查找的数findval和arr[mid]比较
2.1 如果findVal > arr[mid],说明你要查找的数在mid的右边,因此 需要递归的向右查找。
2.2 如果findVal < arr[mid],说明你要查找的数在mid的左边,因此 需要递归的向左查找。
2.3 如果findVal = arr[mid],就返回。

思考:什么时候需要结束递归
1)找到就结束递归
2)递归完整个数组仍然没有找到findVal,也需要结束递归,当left > right就需要 退出

 

复制代码
 1 public static int  binarySearch(int[] arr, int left, int right, int findVal) {
 2         if(left > right) {
 3             return -1;
 4         }
 5         int mid = (left + right) / 2;
 6         int midVal = arr[mid];
 7         if(findVal > midVal) {  // 向右递归查询
 8             return binarySearch(arr, mid + 1, right, findVal);
 9         } else if (findVal < midVal) {  // 向左递归查询
10             return binarySearch(arr, left,mid + 1, findVal);
11         } else {
12             return mid; // 刚好中间一个 就是
13         }
14     }
复制代码

思考这样一个问题:如果查找的数有多个,又如何?

我们只需要将匹配的数的下标装进数组里面

复制代码
 1 // 代码优化,当有多个数值的时候
 2     public static ArrayList<Integer> binarySearch1 (int[] arr, int left, int right, int  findVal) {
 3         if(left > right) {
 4             return new ArrayList<>();
 5         }
 6         int mid = (left + right) / 2;
 7         int midVal = arr[mid];
 8         if(findVal > midVal) { // 向右递归查询
 9             return binarySearch1(arr, mid + 1, right, findVal);
10         } else if (findVal < midVal) { // 向左递归查询
11             return binarySearch1(arr, left, mid - 1, findVal);
12         } else { // 刚好等于的这个情况,左右查找
13             ArrayList<Integer> resArrayList = new ArrayList<Integer>();
14             int temp = mid -1; // 向左查找
15             while (true) {
16                 if(arr[temp] != findVal || temp < 0) {    // 错误1:把arr[temp]写成arr[mid]
17                     break;
18                 }
19                 resArrayList.add(temp); // 把当前下标加到数组
20                 temp--; // 向左移继续找
21             }
22 
23             resArrayList.add(mid);
24 
25             temp = mid + 1; // 向右查找
26             while (true) {
27                 if(arr[temp] != findVal || temp > arr.length - 1) {    // 错误二:这里写成arr.length + 1;
28                     break;
29                 }
30                 resArrayList.add(temp); // 把当前下标加到数组
31                 temp++; // 向右移继续找
32             }
33 
34             return resArrayList;
35 
36         }
37 
38     }
复制代码

 

posted on   Love&Share  阅读(37)  评论(0编辑  收藏  举报

编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示