1. 二分查找:二分查找又称折半查找,二分搜索,折半搜索等。二分查找法作为一种常见的查找方法,将原本是线性时间提升到了对数时间范围,大大缩短了搜索时间。但它有一个前提,就是必须在有序数据中进行查找。
2. 二分查找的时间复杂度:二分查找的时间复杂度为O( logn )。
3. 二分查找的实现:
//查找算法 二分查找 时间复杂度为:O(logn)
//该方式是一种非自适应的查找方式 二分查找的效率比顺序查找的效率高
//查找效率:插入查找 > 斐波那契查找 > 二分查找 > 顺序查找
public class BinarySearch {
public static void main(String[] args) {
int[] arr = {1, 2, 3, 4, 5, 6, 7, 8, 9};
int key = 12;
//迭代的方式实现二分查找
int index = binarySearch(arr, key);
System.out.println("index:" + index);
//递归的方式实现二分查找
int index1 = binarySearch(arr, key, 0, arr.length - 1);
System.out.println("index1:" + index1);
}
/*
* 递归的方法实现二分查找 low表示每次分的起点
* high每次分的终点 mid表示从low到high范围内的中间值
*/
private static int binarySearch(int[] arr, int key, int low, int high) {
if(low > high) {
return -1;
}
int mid = (low + high) / 2;
if(arr[mid] == key) {
return mid;
}
if(arr[mid] > key) {
return binarySearch(arr, key, low, mid - 1);
}else {
return binarySearch(arr, key, mid + 1, high);
}
}
/*迭代的方法实现二分查找 low表示每次分的起点
* high每次分的终点 mid表示从low到high范围内的中间值
*/
private static int binarySearch(int[] arr, int key) {
int low = 0;
int high = arr.length - 1;
int mid = (low + high) / 2;
while(arr[mid] != key) {
if(arr[mid] > key) {
high = mid - 1;
}
if(arr[mid] < key) {
low = mid + 1;
}
if(low > high) {
return -1;
}
mid = (low + high) / 2;
}
return mid;
}
}
4. 运行结果: