二分查找(折半查找)

二分查找/折半查找

      • 概述
      • 查找步骤
      • 代码示例
      • 输出结果

概述

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

查找步骤

二分查找(折半查找)_第1张图片

二分查找的步骤如下:

  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);
        }
    }
}

输出结果

二分查找(折半查找)_第2张图片

你可能感兴趣的:(算法,java,开发语言,算法)