【查找算法系列】二分查找(折半查找)

二分查找/折半查找

文章中的部分照片来源于哔站黑马程序员阿伟老师处,仅用学习,无商用,侵权联系删除!

概述

二分查找(Binary Search)的前提是待查找的数据已经排好序。通过将待查找区间划分为两部分,并将目标值与中间值进行比较,可以确定目标值在左侧区间或右侧区间。然后将查找区间缩小一半,重复进行比较和缩小区间的操作,直到找到目标值或者确定目标值不存在。

查找步骤

在这里插入图片描述

二分查找的步骤如下:

  1. 确定查找区间的起始位置和结束位置,初始时起始位置为0,结束位置为数组长度减1。

  2. 计算出中间位置(可以通过起始位置和结束位置的和除以2得到)。

  3. 比较中间位置的值与目标值的大小。

    • 如果中间位置的值等于目标值,那么找到了目标值,返回对应索引。

    • 如果中间位置的值大于目标值,那么目标值可能在左侧区间,将结束位置更新为中间位置减1,重复步骤2。

    • 如果中间位置的值小于目标值,那么目标值可能在右侧区间,将起始位置更新为中间位置加1,重复步骤2。

  4. 如果起始位置大于结束位置,表示查找区间为空,目标值不存在,返回-1或者其他表示不存在的值。

二分查找的时间复杂度为O(logn),其中n为数据的个数。相较于线性查找的O(n)时间复杂度,二分查找的效率更高。

代码示例

需求:定义一个方法利用二分查找,查询某个元素在数组中的索引
数据如下:{7, 23, 79, 81, 103, 127, 131, 147}

代码如下:

package text.text02;

/*
二分查找/折半查找
核心:
    每次排除一半的查找范围
注意:数据必须是有序的

 */
public class text07A {
    public static void main(String[] args) {
        int[] arr = {7, 23, 79, 81, 103, 127, 131, 147};
        //定义两个要查询的数(一个能查到,一个查不到)
        int number1 = 81;
        int number2 = 45;
        //调用method1方法和judge方法,并将method1的返回值(索引)和要查询的数作为参数传递给judge方法
        judge(method1(arr, number1), number1);    //81已经找到,在数组的的索引为:3
        judge(method1(arr, number2), number2);    //45没有查到!
    }

    //二分查找
    public static int method1(int[] arr, int number) {
        //定义变量记录数组的初始索引
        int min = 0;
        //定义变量记录数组长度-1,即数组的最大索引
        int max = arr.length - 1;
        while (true) {
            //最小索引大于最大索引,即遍历完数组都没找到
            if (min > max) {
                return -1;
            }
            //定义变量用于记录中间位置的索引
            int mid = (max + min) / 2;
            //中间的数大于要查找的数,说明要查找的数在中间的数的左边
            if (arr[mid] > number) {
                //让最大索引变为中间索引-1
                max = mid - 1;
            }
            //中间的数小于要查找的数,说明要查找的数在中间的数的右边
            else if (arr[mid] < number) {
                //让最小的索引变为中间索引+1
                min = mid + 1;
            }
            //说明中间的索引处的数等于要查找的数
            else {
                //返回中间的索引
                return mid;
            }
        }
    }

    //根据返回的数判断要超查找的数存在不存在
    public static void judge(int index, int number) {
        if (index == (-1)) {
            System.out.println(number + "没有查到!");
        } else {
            System.out.println(number + "已经找到,在数组的的索引为:" + index);
        }
    }
}

输出结果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

酷小洋

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

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

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

打赏作者

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

抵扣说明:

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

余额充值