二分查找(Binary Search),也称折半查找,是一种高效的查找算法,其时间复杂度为O(log n)。它是通过将一个有序序列递归地分成两半来进行查找,每次比较中间元素与查找元素的大小关系,从而确定要查找的元素在前半段还是后半段,并依此缩小查找范围,直到找到或者确定不存在为止。
以下是Java中二分查找的实现:
/**
* 二分查找
*
* @param arr 有序数组
* @param target 目标值
* @return 目标值在数组中的索引,不存在则返回-1
*/
public static int binarySearch(int[] arr, int target) {
int left = 0;
int right = arr.length - 1;
while (left <= right) {
int mid = left + (right - left) / 2;
if (arr[mid] == target) {
return mid;
} else if (arr[mid] < target) {
left = mid + 1;
} else {
right = mid - 1;
}
}
return -1;
}
代码中,参数arr表示要查找的有序数组,参数target表示目标值。首先,定义查找范围的左右边界,即left和right变量。然后,使用while循环进行二分查找,直到找到目标值或者左右边界重合(即左边界>右边界)为止。在每一轮循环中,计算中间元素的索引mid,然后比较中间元素mid与目标值target的大小关系,如果mid等于target,则直接返回mid;如果mid小于target,则在右半部分查找,即将左边界left更新为mid+1;如果mid大于target,则在左半部分查找,即将右边界right更新为mid-1。如果循环结束时仍然没有找到目标值,则返回-1表示不存在。
需要注意的是,二分查找的前提是数组必须是有序的,否则无法使用二分查找算法进行查找。另外,对于重复元素的处理,有两种方式:一种是查找第一个等于目标值的元素,一种是查找最后一个等于目标值的元素,还有一种是查找第一个大于等于目标值的元素。针对不同的场景,可以根据需要选择不同的实现方式。