文章中的部分照片来源于哔站
黑马程序员阿伟老师
处,仅用学习,无商用,侵权联系删除!
概述
二分查找(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已经找到,在数组的的索引为: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);
}
}
}