📅  最后修改于: 2023-12-03 15:36:04.059000             🧑  作者: Mango
二进制搜索,也被称为折半搜索或对数搜索是一种查找算法。它在有序数组中查找给定元素的位置。这个算法每次都将查找范围划分为两半,因此可以将搜索时间缩短为O(log n)。
二进制搜索算法的思路很简单,首先设定查找范围为整个数组,即左边界为0,右边界为数组长度减一。此后在每一步迭代中,都进行如下三个步骤:
Java的二进制搜索算法的实现如下:
/**
* 二进制搜索算法
*
* @param array 待搜索的数组,必须为升序排列
* @param target 目标值
* @return 目标值在数组中的下标,如果不存在则返回-1
*/
public static int binarySearch(int[] array, int target) {
int left = 0;
int right = array.length - 1;
while (left <= right) {
int mid = (left + right) / 2;
if (array[mid] == target) {
return mid;
} else if (array[mid] < target) {
left = mid + 1;
} else {
right = mid - 1;
}
}
return -1;
}
在此实现中,我们通过left
和right
来表示当前的查找范围。mid
是当前猜测的值。我们使用left <= right
来保证在每一步迭代中查找范围都不为空。如果在迭代中找到了目标值,则直接返回。如果猜测值比目标值小,则将左边界设为mid+1
;如果猜测值比目标值大,则将右边界设为mid-1
。
二进制搜索算法的平均时间复杂度为O(log n)。但是要求数组必须是有序的。除此之外,该算法还有如下优点:
不过,由于这种算法需要维护查找范围,因此它需要的空间也比线性查找多。