📅  最后修改于: 2023-12-03 14:42:55.773000             🧑  作者: Mango
二分搜索,也称为折半搜索,是一种在有序数组中查找目标元素的算法。该算法的时间复杂度为O(log n),相较于一般的线性搜索,可以大大减少搜索时间。在Java中,可以使用Arrays中提供的二分搜索方法binarySearch来快速实现该算法。
Arrays类中提供了多个重载的二分搜索方法,我们这里以其中的一个常用方法为例来介绍基本使用。
public static int binarySearch(int[] a, int key)
该方法接受一个有序的int数组a和一个要搜索的int值key作为参数,返回值为搜索结果的下标。如果搜索结果不存在,则返回负值。这个负值为(-(插入点) - 1),其中插入点为将key插入到数组a中的下标位置。返回的负值可以用于在数组a中按从小到大的顺序进行插入key。
下面是一个简单的例子,展示如何使用binarySearch查找一个元素在一个有序的int数组中的位置:
import java.util.Arrays;
public class Example {
public static void main(String[] args) {
int[] arr = {1, 2, 3, 4, 5, 6, 7};
int key = 4;
int index = Arrays.binarySearch(arr, key);
if(index >= 0) {
System.out.println(key + " found at index " + index);
} else {
System.out.println(key + " not found. Insert at index " + (-index-1));
}
}
}
输出结果:
4 found at index 3
除了基本使用之外,binarySearch方法还支持使用Comparator接口来自定义搜索规则。Comparator接口是Java中的一个函数式接口,其中的抽象方法compare定义了自定义比较的规则。
下面的例子展示了如何在一个自定义类型的数组中使用binarySearch方法查找元素。
import java.util.Arrays;
import java.util.Comparator;
class Person {
private String name;
private int age;
// constructor and getter/setter methods
}
class PersonAgeComparator implements Comparator<Person> {
public int compare(Person p1, Person p2) {
return p1.getAge() - p2.getAge();
}
}
public class Example {
public static void main(String[] args) {
Person[] arr = {
new Person("John", 25),
new Person("Jane", 32),
new Person("Mike", 18),
new Person("Bob", 45)
};
// 按年龄升序排序
Arrays.sort(arr, new PersonAgeComparator());
Person key = new Person("Mike", 18);
int index = Arrays.binarySearch(arr, key, new PersonAgeComparator());
if(index >= 0) {
System.out.println(key.getName() + " found at index " + index);
} else {
System.out.println(key.getName() + " not found.");
}
}
}
输出结果:
Mike found at index 1
完整的示例代码可以在以下链接中找到: