二分查找(Binary Search),又称折半查找,是一种在有序数组或列表中查找特定元素的搜索算法。其基本思想是利用数列有序这一特性,通过不断将待搜索区域缩小一半的方式来快速逼近目标值。
以下是二分查找的主要步骤:
1. **初始化**: 首先,确保数据结构是一个有序数组(通常是升序或降序)。
2. **确定范围**: 设定初始搜索区间为整个数组,即从数组的第一个元素到最后一个元素。
3. **计算中间索引**: 计算区间的中间元素索引(通常是`low + (high - low) / 2`,其中`low`和`high`分别是当前搜索区间的起始和结束索引)。
4. **比较中间元素**: 将中间元素与要查找的目标值进行比较:
- 如果目标值等于中间元素,则查找成功,返回中间元素的索引。
- 如果目标值小于中间元素,则在数组的左半部分(即从`low`到新的中间索引减一的部分)继续执行二分查找。
- 如果目标值大于中间元素,则在数组的右半部分(即从新的中间索引加一到`high`的部分)继续执行二分查找。
5. **更新区间**: 根据比较结果,将搜索区间缩小到目标值所在的那一半。
6. **重复步骤3至5**: 直到找到目标值,或者搜索区间为空(表示目标值不存在于数组中)。
由于每次迭代都将搜索空间大约减半,因此二分查找的时间复杂度是O(log n),这里的n是数组中的元素个数。这种高效的查找方式特别适用于大型且已排序的数据集。
老规矩,还是以一组图解析整个过程:
二分查找图画讲解
Java数组本身是支持二分查找的,以下是一个简单示例,有兴趣可以去看二分查找的源码:
import java.util.Arrays;
public class BinarySearch {
public static void main(String[] args) {
int[] arr = {1, 9, 7, 5, 3, 2, 4, 6, 8};
Arrays.sort(arr);
int i = Arrays.binarySearch(arr, 5);
System.out.println(i);
}
}