二分查找
1. 普通查找和二分查找
a. 普通查找
- 原理:遍历数组,获取每一个元素,然后判断当前遍历的元素是否和要查找的元素相同,如果相同就返回该元素的索引;
- 如果没有找到,就返回一个负数作为标识(一般是 -1);
b. 二分查找
- 原理: 每一次都去获取数组的中间索引所对应的元素,然后和要查找的元素进行比对,如果相同就返回索引;
- 如果不相同,就比较中间元素和要查找的元素的值;
- 如果中间元素的值大于要查找的元素,说明要查找的元素在左侧,那么就从左侧按照上述思想继续查询(忽略右侧数据);
- 如果中间元素的值小于要查找的元素,说明要查找的元素在右侧,那么就从右侧按照上述思想继续查询(忽略左侧
数据); - 二分查找对数组是有要求的,数组必须已经排好序;
- 时间复杂度:二分搜索每次把搜索区域砍掉一半,很明显时间复杂度为
O
(
l
o
g
n
)
O(log n)
O(logn);
- 空间复杂度:
O
(
1
)
O(1)
O(1),虽递归形式定义,但是尾递归,可改写为循环;
- 应用:
Arrays.binarySearch(int[] arr, target);
;
2. 图解
3. Java 实现
public class Test {
public static void main(String[] args) {
int[] arr = {10, 14, 21, 38, 45, 47, 53, 81, 87, 99};
int index = binarySearch(arr, 38);
System.out.println(index);
}
public static int binarySearch(int arr[], int target) {
int left = 0;
int right = arr.length - 1;
while (left <= right) {
int middle = (left + right) / 2;
if (arr[middle] == target) {
return middle;
} else if (arr[middle] < target) {
left = middle + 1;
} else {
right = middle - 1;
}
}
return -1;
}
}