二分查找

一、原理

对于有序的数组,不是顺序的查找,而是折半的查找,对比查找的值与数组中间值,逐步缩短查找范围。

时间复杂度: 最好(直接命中)O(1) 最坏(最边缘命中) O(log2n)
空间复杂度: 常规O(1) 递归O(log2n)

二、举例

arr = {1,2,3,4,5,6,7,8,9,10}

low: 左边界 high: 右边界 mid:(low+high)/2

  1. 查找5
    直接命中
  2. 查找1
    在这里插入图片描述
  3. 查找10
    在这里插入图片描述
三、 代码实现
public class BinarySearch {
    //常规二分查找
    public static Boolean binarySearch(int[] arr, int target) {
        int length = arr.length - 1;
        int low = 0;
        int high = length;
        boolean result = false;
        while (low <= high) {
            int mid = (high + low) / 2;
            System.out.println("low: " + arr[low] + " mid:" + arr[mid] + " high:" + arr[high] + " target:" + target);
            if (arr[mid] > target) {
                high = mid - 1;
            } else if (arr[mid] < target) {
                low = mid + 1;
            } else {
                result = true;
                break;
            }
        }
        return result;
    }

    //递归二分查找
    public static Boolean binarySearchByRecursion(int[] arr, int target, int low, int high) {
        if (low <= high) {
            int mid = (low + high) / 2;
            System.out.println("low: " + arr[low] + " mid:" + arr[mid] + " high:" + arr[high] + " target:" + target);
            if (arr[mid] > target) {
                return binarySearchByRecursion(arr, target, low, mid - 1);
            } else if (arr[mid] < target) {
                return binarySearchByRecursion(arr, target, mid + 1, high);
            } else {
                return true;
            }
        }
        return false;
    }

    public static void main(String[] args) {
        int[] arr = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
        System.out.println(binarySearch(arr, 10));
       // System.out.println(binarySearchByRecursion(arr, 1, 0, arr.length - 1));
    }
}
四、优缺点

优点: 比顺序查找节约时间
缺点: 数组必须有序

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Selenium399

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值