java:为什么这个带比较器的binarySearch无效?

时间:2015-01-23 20:49:07

标签: java sorting

更新:我正在尝试使用Collections.sort()来使用比较器参数对arrayList进行排序。然后做二元搜索。

package collection;

import java.util.*;

public class TryBinarySearch {
    public static void main(String[] args){
        List<Integer> list = new ArrayList<>();
        for (int i = 0; i < 100; i++)
           list.add(i);
        System.out.println(list);
        int b = Collections.binarySearch(list, 8);
        System.out.println(b); // a is 8 as expected.

        Collections.shuffle(list);
        System.out.println(list);   

        Collections.sort(list, new
                Comparator<Integer>(){
            public int compare(Integer a, Integer b){
                return b.intValue() - a.intValue();
            }
        });
        System.out.println(list);   //list is reversed as expected.
        int a = Collections.binarySearch(list, 8);
        System.out.println(a); // why a is -1?
    }
}

b是预期的8; 我做了一个反向排序。我的问题是为什么a是-1而不是92?

5 个答案:

答案 0 :(得分:6)

你洗了清单,所以它没有排序。您必须有一个排序列表才能进行二进制搜索

答案 1 :(得分:3)

要执行二进制搜索,必须对列表进行排序。您首先对列表进行了洗牌,这使Collections.binarySearch的先决条件无效。

  

在进行此调用之前,必须根据指定的比较器(通过sort(List,Comparator)方法)将列表按升序排序。如果未排序,则结果未定义。

该算法依赖于正在排序的列表。因此,当您稍后对其进行排序时,binarySearch可以正常工作。

答案 2 :(得分:3)

二进制搜索仅在列表已排序时有效。二进制搜索的工作方式是该算法假定如果其值为&#34;猜测&#34; index高于我们要查找的索引,实际索引必须更低 - 反之亦然。

如果集合没有排序,那么该假设不会成立,因此算法失败。

documentation非常清楚地说明了这一点:

  

在进行此调用之前,必须根据指定的比较器(如sort(List, Comparator)方法)将列表按升序排序。如果未排序,则结果未定义。

答案 3 :(得分:0)

二进制搜索取决于您要搜索的列表。你明确地改变了你的。您的意思是通过Comparator排序吗?

答案 4 :(得分:0)

在致电binarySearch(list, key)时,文档说:

  

列表必须按照自然顺序按升序排序

您的列表是使用自定义Comparator排序的,因此您需要将其传递给调用以指示搜索算法如何比较项目:

    Comparator<Integer> cmp = new Comparator<Integer>(){
        public int compare(Integer a, Integer b){
            return b.intValue() - a.intValue();
        }
    };
    Collections.sort(list, cmp);
    System.out.println(list);   //list is reversed as expected.
    int a = Collections.binarySearch(list, 8, cmp);

对于这个电话,文档说:

  

列表必须根据指定的比较器按升序排序