二分查找(Binary Search)是一种在有序数组中查找目标值的算法。Java中实现二分查找的示例代码如下:
public class BinarySearch {
// 二分查找方法
public static int binarySearch(int[] array, int target) {
int left = 0;
int right = array.length - 1;
while (left <= right) {
int mid = left + (right - left) / 2;
// 如果目标值等于中间值,则返回中间索引
if (array[mid] == target) {
return mid;
}
// 如果目标值小于中间值,则在左半部分继续查找
else if (array[mid] > target) {
right = mid - 1;
}
// 如果目标值大于中间值,则在右半部分继续查找
else {
left = mid + 1;
}
}
// 如果未找到目标值,则返回-1
return -1;
}
public static void main(String[] args) {
int[] array = {1, 3, 5, 7, 9, 11, 13, 15, 17, 19};
int target = 7;
int index = binarySearch(array, target);
if (index != -1) {
System.out.println("目标值 " + target + " 在数组中的索引为: " + index);
} else {
System.out.println("目标值 " + target + " 不在数组中。");
}
}
}
这段代码定义了一个`binarySearch`方法,它接受一个有序数组和一个目标值作为参数,并返回目标值在数组中的索引,如果目标值不在数组中,则返回-1。
在`main`方法中,我们定义了一个有序数组`array`和一个目标值`target`,然后调用`binarySearch`方法进行查找。如果找到目标值,则输出目标值在数组中的索引;如果未找到,则输出目标值不在数组中的提示信息。
可优化的点
-
循环终止条件的优化:
- 在循环中,条件是
left <= right,但当left和right相等时,仍然会执行一次循环。实际上,这时候已经没有必要再继续查找了,因为已经检查过了整个数组,可以直接返回-1。 - 因此,可以将循环条件修改为
left < right。
- 在循环中,条件是
-
中间索引的计算:
- 在计算中间索引时,使用了
(left + right) / 2的方式。但这种方式可能会在left和right的值比较大时导致整型溢出。 - 更安全的方式是使用
left + (right - left) / 2来计算中间索引,这样可以避免溢出的问题。
- 在计算中间索引时,使用了
-
返回值处理的优化:
- 在未找到目标值时,返回了-1。但这样的返回值可能会与数组中的实际元素索引混淆,特别是当数组中可能存在负数时。
- 一种更好的做法是返回
-(left + 1),其中left是目标值应该插入的位置。这样可以通过返回的负数来表明未找到目标值,并且可以保持返回值的唯一性。

7073

被折叠的 条评论
为什么被折叠?



