二分查找/折半查找
- 概述
- 查找步骤
- 代码示例
- 输出结果
概述
二分查找(Binary Search)的前提是待查找的数据已经排好序。通过将待查找区间划分为两部分,并将目标值与中间值进行比较,可以确定目标值在左侧区间或右侧区间。然后将查找区间缩小一半,重复进行比较和缩小区间的操作,直到找到目标值或者确定目标值不存在。
查找步骤
二分查找的步骤如下:
-
确定查找区间的起始位置和结束位置,初始时起始位置为0,结束位置为数组长度减1。
-
计算出中间位置(可以通过起始位置和结束位置的和除以2得到)。
-
比较中间位置的值与目标值的大小。
-
如果中间位置的值等于目标值,那么找到了目标值,返回对应索引。
-
如果中间位置的值大于目标值,那么目标值可能在左侧区间,将结束位置更新为中间位置减1,重复步骤2。
-
如果中间位置的值小于目标值,那么目标值可能在右侧区间,将起始位置更新为中间位置加1,重复步骤2。
-
-
如果起始位置大于结束位置,表示查找区间为空,目标值不存在,返回-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已经找到,在数组的的索引为:3judge(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) {//让最大索引变为中间索引-1max = mid - 1;}//中间的数小于要查找的数,说明要查找的数在中间的数的右边else if (arr[mid] < number) {//让最小的索引变为中间索引+1min = 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);}}
}