1.算法描述
在计算机科学中,二分查找算法(英語:binary search algorithm),也称折半搜索算法(英語:half-interval search algorithm)、对数搜索算法(英語:logarithmic search algorithm),是一种在有序数组中查找某一特定元素的搜索算法。
2. 原理
二分查找的思想非常简单,有点类似分治的思想。二分查找针对的是一个有序的数据集合,每次都通过跟区间的中间元素对比,将待查找的区间缩小为之前的一半,直到找到要查找的元素,或者区间被缩小为 0.

3.算法实现
3.1 递归实现
public static void main(String[] args) {
int[] arr = new int[]{11, 17, 22, 36, 40, 43, 48, 54, 61, 70, 78, 82, 89, 92, 99};
int key = 22;
key = binarySearch(arr, key, 0, arr.length - 1);
if (key == -1) {
System.out.println("没有找到数据");
} else {
System.out.println(key);
}
}
/**
* 二分查找递归实现
*
* @param arr 查找数据
* @param key 查找的元素
* @param left 数组低位索引
* @param right 数组高位索引
* @return 查找到的数据,不存在返回-1
*/
private static int binarySearch(int[] arr, int key, int left, int right) {
if (arr == null || arr.length <= 0 || left > right || key < arr[left] || key > arr[right]) {
return -1;
}
int mid = (left + right) / 2;
if (key < arr[mid]) {
return binarySearch(arr, key, left, mid - 1);
} else if (key > arr[mid]) {
return binarySearch(arr, key, mid + 1, right);
} else {
return arr[mid];
}
}
3.2 循环实现
/**
* 二分查找普通实现
*
* @param arr 查找数据
* @param key 查找的元素
* @return 查找到的数据,不存在返回-1
*/
public static int binarySearch(int arr[], int key) {
int mid;
int left = 0;
int right = arr.length - 1;
while (left <= right) {
mid = (right - left) / 2 + left;
if (key < arr[mid]) {
right = mid - 1;
} else if (key > arr[mid]) {
left = mid + 1;
} else {
return arr[mid];
}
}
return -1;
}
4. 总结
4.1 使用注意事项
- 存储在数组中
- 数组必须是有序的
- 如果无需数组,必须先排序,排序的时间复杂度最低是 O(nlogn)
4.2 时间复杂度
二分查找的时间复杂度为O(logn)