📜  Java中的二分搜索binarySearch(1)

📅  最后修改于: 2023-12-03 14:42:55.773000             🧑  作者: Mango

Java中的二分搜索binarySearch

二分搜索,也称为折半搜索,是一种在有序数组中查找目标元素的算法。该算法的时间复杂度为O(log n),相较于一般的线性搜索,可以大大减少搜索时间。在Java中,可以使用Arrays中提供的二分搜索方法binarySearch来快速实现该算法。

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
示例代码

完整的示例代码可以在以下链接中找到:

Java中的二分搜索binarySearch的示例代码