定义
二分查找是一种用于在有序数组或列表中查找特定元素的高效算法。它的工作原理是将待查找的区间不断缩小为一半,直到找到目标元素或确定目标元素不存在为止。以下是二分查找的基本步骤和解释:
解释:
-
初始化:首先,确定查找范围的起始和结束位置。通常,这是整个数组或列表的起始和结束位置。
-
计算中间位置:计算查找范围的中间位置,即
(起始位置 + 结束位置) / 2
。 -
比较中间元素:将目标元素与中间位置的元素进行比较。
- 如果中间元素等于目标元素,搜索成功,返回中间位置。
- 如果中间元素小于目标元素,说明目标元素在中间元素的右侧,因此将查找范围缩小为右半部分,更新起始位置为中间位置加一。
- 如果中间元素大于目标元素,说明目标元素在中间元素的左侧,因此将查找范围缩小为左半部分,更新结束位置为中间位置减一。
-
重复步骤2和步骤3,直到找到目标元素或起始位置大于结束位置。如果起始位置大于结束位置,表示目标元素不在数组或列表中,搜索失败。
时间复杂度
二分查找的关键是每次都将查找范围缩小一半,因此它的时间复杂度是 O(log n),其中 n 是数组或列表的大小。这使得它在大型数据集上比线性搜索更加高效。但要注意,二分查找要求数据必须有序,否则无法正常工作。
总之,二分查找是一种快速有效的查找算法,适用于有序数据集。它通过不断缩小查找范围,减少了搜索的时间复杂度,是许多编程任务中常用的工具之一。
代码实例
import java.util.Arrays;
import java.util.Scanner;
public class BinarySearch {
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; // 没有找到目标元素
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("请输入要查找的目标元素:");
int target = scanner.nextInt();
scanner.nextLine(); // 消耗换行符
System.out.print("请输入要查找的数组(以空格分隔):");
String inputArray = scanner.nextLine();
String[] inputValues = inputArray.split("\\s+");
int[] arr = new int[inputValues.length];
for (int i = 0; i < inputValues.length; i++) {
try {
arr[i] = Integer.parseInt(inputValues[i]);
} catch (NumberFormatException e) {
System.out.println("输入的数组不是有效的整数数组。");
return;
}
}
// 首先对数组进行排序
Arrays.sort(arr);
int result = binarySearch(arr, target);
if (result != -1) {
System.out.println("目标元素 " + target + " 在索引 " + result + " 处找到。");
} else {
System.out.println("目标元素 " + target + " 未找到。");
}
// 输出排好序的数组
System.out.print("排好序的数组:");
for (int num : arr) {
System.out.print(num + " ");
}
System.out.println();
}
}
运行截图
代码解释
该程序允许用户自己输入要查找的目标元素 和要查找的数组(用户输入的数组会自动排序)
这里导入了 Arrays
类用于对数组排序,以及 Scanner
类用于从控制台读取用户的输入。
定义 binarySearch
方法:这个方法接受一个有序整数数组 arr
和目标元素 target
,然后执行二分查找,返回目标元素的索引(如果找到)或 -1
(如果未找到)。
如果输入的数组不是有效的整数数组,它还会进行错误处理。
for (int num : arr)
这是一个增强 for 循环的语法,它会依次将数组 arr
中的每个元素赋值给变量 num
,然后执行循环体
System.out.print(num + " ")
在循环体内,我们使用 System.out.print()
方法将当前元素 num
输出到控制台,同时在元素之后添加一个空格,以便将元素以空格分隔的形式输出。