簡體   English   中英

Arrays.BinarySearch是否要求數組按升序排序

[英]Does Arrays.BinarySearch require that the array is sorted in ascending order

根據文件:

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)。
為什么文檔說數組必須按升序排序?

它說“必須根據指定的比較器按升序排序”。 粗體部分是關鍵部分; 你的數組確實是根據指定的比較器排序的(因為你只是對它進行了排序!)。

它要求所有元素都根據比較器的實現方式而增加。 例如,您使用反向比較器,所有元素必須按相反的順序排列。

為什么文檔說數組必須按升序排序?

二進制搜索基於此假設進行工作。 http://en.wikipedia.org/wiki/Binary_search_algorithm當比較中間元素時,它可以假設如果它大於該元素,它也大於中間元素之前的所有元素。 如果數組沒有特定的順序,則必須搜索整個數組,也稱為強力搜索。

每個比較器定義給定類型的元素的排序。 要求僅僅是必須對數組元素進行排序,使得[0] <... <a [n-1]用於<的有效定義。 該定義不必與我們傳統的<例如數字 - 的概念相對應 - 實際上,它甚至可以被定義為傳統的>。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM