Arrays.BinarySearch是否要求数组按升序排序

时间:2012-01-02 18:26:29

标签: java string oop scjp

根据文件:

public static <T> int binarySearch(T[] a, T key, Comparator<? super T> c)        
  

使用二进制文件在指定的数组中搜索指定的对象   搜索算法。

     

数组必须按照升序排序   指定比较器(由sort(T [],Comparator)方法)之前   打电话。

     

如果未排序,则结果未定义。如果数组包含多个等于指定对象的元素,则没有   保证找到哪一个。

上述是否意味着只有当数组按升序顺序排序时才能使用Arrays.binarySearch方法?

我测试了它,如下所示

class Unturned {
    public static void main(String[] args) {
        String[] chars = {"a", "b", "c", "e","f","h","i"};
        MySort ms = new MySort();

        Arrays.sort(chars, ms);
        for(String c : chars ) System.out.print(c + " ");

        System.out.println("\n" + Arrays.binarySearch(chars, "d", ms));
    }
    static class MySort implements Comparator<String> {
        public int compare(String a, String b) {
            return b.compareTo(a);
} } }

输出:

i h f e c b a
-5

-5将插入点放在值为c且正确的元素处。 (即-4-1)。
为什么文档说数组必须按升序排序?

3 个答案:

答案 0 :(得分:5)

它表示“必须根据指定的比较器按升序排序”。粗体部分是关键部分;你的数组确实是根据指定的比较器排序的(因为你只是对它进行了排序!)。

答案 1 :(得分:4)

它要求所有元素都根据Comparator的实现方式而增加。例如你使用反向比较器,所有元素必须是相反的顺序。

  

为什么文档说数组必须按升序排序?

二进制搜索基于此假设。 http://en.wikipedia.org/wiki/Binary_search_algorithm当它比较中间元素时,它可以假设如果它大于该元素,它也大于中间元素之前的所有元素。如果数组没有特定的顺序,则必须搜索整个数组,也称为强力搜索。

答案 2 :(得分:3)

每个比较器定义给定类型元素的排序。要求仅仅是必须对数组元素进行排序,使得a [0] <0。 ......&lt; a [n-1]用于某些有效的定义&lt;。该定义不必与我们的传统概念相对应。例如数字 - 事实上,它甚至可以被定义为传统的&gt;。