二分查找详解

1、什么是二分查找?

二分查找又叫折半查找,是一种高效简单的查找算法,通常用于在有序的数组中查找某个元素,例如从{1,2,4,6,8,9,10,23,24}的数组中中查找值是8的元素,就可以采用二分查找法。

2、二分查找的思想是什么?

二分查找的思想:给你一个有序的序列,取中间元素和目标元素进行对比,取其中的一半,丢弃另一半,快速缩小目标元素所在的位置。主要思想还是:快速缩小目标元素所在的区间

3、二分查找的前置条件是什么?

在序列中查找某个数,采用二分查找法,则该序列应该满足的条件是:

  1. 序列必须是有序的,升序或者降序都可以,这个条件主要是二分查找时需要和序列中的中间元素进行比较来排除一半的元素,如果是无序的,则比较无意义 。       
  2. 序列必须是顺序存储元素的,顺序存储元素主要是可以快速的获取中间元素(可以通过索引),不然只能通过遍历来获取中间的元素,但是这种做法无意义,因为直接找该元素的时间复杂度为O(n),遍历获取中间元素再比较还不如直接查找。

以上两个条件都满足的最常见的数据结构就是:有序数组。

4、二分查找的步骤是什么?

在序列中查找某个元素,二分查找步骤为:

  1. 序列的长度为0或者为null,或者目标元素不存在返回-1
  2. 取出序列的中间元素将其和目标元素进行对比,如果相同则返回中间元素的索引
  3. 如果中间元素大于目标元素,则目标元素所在区域在中间元素的左侧,则将左侧的序列作为一个新的序列,从步骤1重新开始
  4. 如果中间元素小于目标元素,则目标元素所在区域在中间元素的右侧,则将右侧的序列作为一个新的序列,从步骤1重新开始。

5、二分查找的代码

普通的二分查找:

 private static int binarySearch(int[] arr, int target) {
        if (arr == null || arr.length == 0) {
            return -1;
        }
        int low = 0;
        int high = arr.length - 1;
        while (low <= high) {
            int middle = (low + high) / 2;
            if (arr[middle] == target) {
                return middle;
            } else if (arr[middle] > target) {
                high = middle - 1;
            } else if (arr[middle] < target) {
                low = middle + 1;
            }
        }
        return -1;
    }

递归的二分查找:

private static int binarySearch(int[] arr, int low, int high, int target) {
        if (low <= high) {
            int middle = (low + high) / 2;
            if (arr[middle] == target) {
                return middle;
            } else if (arr[middle] > target) {
                return binarySearch(arr, low, middle - 1, target);
            } else if (arr[middle] < target) {
                return binarySearch(arr, middle + 1, high, target);
            }
        }
        return -1;
    }

6、二分查找的总结

  1. 二分查找的时间复杂度为:O(logn),空间复杂度为:O(1)
  2. 序列必须是有序和顺序存储的,比如有序数组

7、二分查找的类比

二分查找类似于:寻找一张纸上的一个点,可以确定其在哪一边,我们的方法是对折,查找,对折,再查找,简单高效。

  • 6
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值