目录
通常情况下,使用二分查找可以确定想要查询的数据是否存在于某个数组中或者集合中。
此外,使用二分查找的前提是,要查询的数组内数据的顺序必须是有序的,顺序既可以从小到大排列,也可以从大到小都可以排列,只是代码稍微有些不同,但核心解体思想都是一样的。
二分查找的核心思路就是每次砍掉一半的数据,时间复杂度为 logn,是一个比较优秀的算法时时间复杂度。
例如一个数组中存放了9个数据,我们要查找的数据是52,那么就让52与数组中间的数据进行比较,即4索引处的数据,比较之后得出结果,会分为以下三种情况。
情况一:如果取4索引处的数与要查询的数52做对比,若恰好相等,则说明4索引处的数据就是要查找的数据52;
情况二:如果4索引处的数据大于52,则说明要查找的数据在数组的左半边,循环上面的查找思路,再取中间的数据与52做对比,直到查找到要查询的数据,如果循环查找结束仍然没有与之匹配的值,则说明要查找的数据在当前数组中不存在;
情况三:如果4索引处的数据小于52,则说明要查找的数据在数组的右半边,再取中间的数据与52做对比,循环上面的查找思路,直到查找到要查询的数据,如果循环查找结束仍然没有与之匹配的值,则说明要查找的数据在当前数组中不存在;
此外,我们学习的二叉树,红黑树,它们的检索的复杂度都是 logn,遇到一个节点会选择左子树或者有字数,直到查询到结果为止。
- // 定义成一个静态方法,方便以后的调用
- // 方法参数分别传入一个待查询的数组 arr 和待查询的值 number
- // 以数组从小到大排列为例
- // 方法返回值为要查询的数在数组中所在的索引值而非数值
- public static int search(int[] arr, int number) {
- // 定义最小值变量 min 等于数组的最小值索引
- int min = 0;
-
- // 定义最大值变量 max 等于数组的最大值索引
- int max = arr.length - 1;
-
- // while死循环
- while (true){
- // 如果 min > max,说明要查找的数据在数组中不存在
- if (min > max){
- return -1;
- }
- // 定义中间变量 middle
- int middle = (min + max) / 2;
- // arr[middle] > number,说明要查找的数在左边
- if (number < arr[middle]){
- // 将最大值赋值为 middle 左边的第一个数据,重新计算 middle
- max = middle -1;
- // arr[middle] < number,说明要查找的数在右半边,
- }else if (number > arr[middle]){
- // 将最小值赋值为 middle 右边的第一个数据,重新计算 middle
- min = middle + 1;
- }else {
- // 上面都不符合,则当前值即为要寻找的值
- return middle;
- }
- }
- }