二分查找-四大查找算法(二)

本文详细介绍了二分查找算法的原理和实现,包括查找单个结果和多个结果的两种情况。通过递归方式,当查找的数大于、等于或小于中间值时,分别在数组的右半部分、找到或左半部分继续查找。二分查找算法在有序数组中具有较高的查找效率,比线性查找更快。文章提供了Java代码示例,并进行了测试验证。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

二分查找又叫折半查找,只能对有序的数组进行查找,效率比线性查找快的多

思路说明

1.首先确定该数组的中间的下标 (left、right)指数组的左右下标mid=(left+right)/2
2.然后让需要查找的数findVal和arr[mid]比较
1)findVal>arr[mid],说明你要查找的数在mid的右边,因此需要向右递归继续查找
2)findVal=arr[mid]说明你要查找的数就是arr[mid]直接返回就行
3)findVal<arr[mid]说明你要查找的数就在mid的左边,因此需要向左递归继续查找
3.什么时候结束递归
1)找到就结束递归
2)递归完整个数组,也没找到,即left>right

先写一个查找单个结果的方法

//查找单个结果的
    public static int binarySearch(int arr[], int s, int left, int right) {
        int mid = (left + right) / 2;
        int index = left;
        if (left > right) {
            return -1;
        }
        for (int i = 0; i < arr.length; i++) {
            if (s > arr[mid]) {
                return binarySearch(arr, s, mid + 1, right);
            } else if (s == arr[mid]) {
                return index = mid;
            } else {
                return binarySearch(arr, s, left, mid - 1);
            }
        }
        return index;
    }

然后再写一个查找有多个结果的

//查找多个结果的
    public static List<Integer> binarySearch2(int arr[], int s, int left, int right) {
        List<Integer> list = new ArrayList<Integer>();
        int mid = (left + right) / 2;
        int index = left;
        if (left > right) {
            return new ArrayList<Integer>();
        }
        for (int i = 0; i < arr.length; i++) {
            if (s > arr[mid]) {
                return binarySearch2(arr, s, mid + 1, right);
            } else if (s == arr[mid]) {
                list.add(mid);
                int temp = mid + 1;
                while (temp < right) {
                    if (s == arr[temp]) {
                        list.add(temp);
                        temp++;
                    } else {
                        break;
                    }
                }
                temp = mid - 1;
                while (temp > left) {
                    if (s == arr[temp]) {
                        list.add(temp);
                        temp--;
                    } else {
                        break;
                    }
                }
                return list;
            } else {
                return binarySearch2(arr, s, left, mid - 1);
            }
        }
        return list;
    }

然后测试

 public static void main(String[] args) {
        int arr[] = {1, 2, 4, 5, 626, 666, 666};
        List<Integer> list = binarySearch2(arr, 666, 0, arr.length);
        System.out.println(list);
    }

这是结果图

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值