查找算法之二分查找

思路:

二分查找是基于有序数组才能使用,这里举例的是从小到大的有序数组。通过中轴值与目标值进行比较,来判断目标值是在中轴的左边还是右边,以此来缩小查找范围。利用递归进行不断查找,没有找到那么退出。如果找到了,就向左向右循环看看紧挨着的值是否也等于目标值,如果等于,那么也将它们的下标返回出去。

 代码:

复制代码
 1     /**
 2      * 二分查找
 3      * @param arr   从小到大的有序数组
 4      * @param left  数组的左索引
 5      * @param right 数组的右索引
 6      * @param value 寻找的目标值
 7      * @return
 8      */
 9     public static List<Integer> binarySearch(int[] arr, int left, int right, int value) {
10         if (arr == null || arr.length == 0) {
11             return Collections.emptyList();
12         }
13         if (left > right) {
14             //在数组中没有找到目标值
15             return Collections.emptyList();
16         }
17         //中轴
18         int pivot = (left + right) / 2;
19         //值等于value的下标的集合
20         ArrayList<Integer> result = new ArrayList<>(arr.length);
21         //将中轴指向的值与value比较
22         if (value < arr[pivot]) {
23             //如果value小,那从左边找
24             return binarySearch(arr, left, pivot - 1, value);
25         } else if (value > arr[pivot]) {
26             //如果value大,那从右边找
27             return binarySearch(arr, pivot + 1, right, value);
28         } else {
29             int temp = pivot;
30             //如果相等,那看看左右紧挨着的值是否也相等
31             while (temp >= 0 && arr[temp] == value) {
32                 //向左查找
33                 result.add(temp);
34                 temp--;
35             }
36             temp = pivot + 1;
37             while (temp <= arr.length - 1 && arr[temp] == value) {
38                 //向右查找
39                 result.add(temp);
40                 temp++;
41             }
42         }
43         return result;
44     }
复制代码

 

posted @   Java厨师长  阅读(13)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示