📜  Java中的二分搜索binarySearch

📅  最后修改于: 2020-08-21 10:05:19             🧑  作者: Mango

用Java进行二进制搜索有两种方法。

  1. Arrays.binarysearch():适用于也可以是原始数据类型的数组。
    // Java利用那个Array展示二进制搜索binarySearch().
    import java.util.Arrays;
    public class GFG {
        public static void main(String[] args)
        {
            int arr[] = { 10, 20, 15, 22, 35 };
            Arrays.sort(arr);
            int key = 22;
            int res = Arrays.binarySearch(arr, key);
            if (res >= 0)
                System.out.println(key + " 被找到,在index = "
                                                      + res);
            else
                System.out.println(key + " 无对应元素 ");
            key = 40;
            res = Arrays.binarySearch(arr, key);
            if (res >= 0)
                System.out.println(key + " 被找到,在index = "
                                                      + res);
            else
                System.out.println(key + " 无对应元素");
        }
    }

    输出:

    22 被找到,在index = 3
    40 无对应元素
  2. Collections.binarysearch()适用于ArrayList和LinkedList之类的对象集合。
    // Java代码展示针对ArrayList和LinkedList的二进制所搜binarySearch()
    import java.util.List;
    import java.util.ArrayList;
    import java.util.Collections;
    public class GFG
    {
        public static void main(String[] args)
        {
            List al = new ArrayList();
            al.add(1);
            al.add(2);
            al.add(3);
            al.add(10);
            al.add(20);
            // 10 在index=3.
            int key = 10;
            int res = Collections.binarySearch(al, key);
            if (res >= 0)
                System.out.println(key + " 被找到,在index = "
                                                     + res);
            else
                System.out.println(key + " 无对应元素");
            key = 15;
            res = Collections.binarySearch(al, key);
            if (res >= 0)
                System.out.println(key + " 被找到,在index = "
                                                      + res);
            else
                System.out.println(key + " 无对应元素");
        }
    }

    输出:

    10 被找到,在index = 3
    15 无对应元素

    如果输入未排序怎么办?
    如果输入列表未排序,则结果不确定。

    如果有重复该怎么办?
    如果有重复项,则不能保证将找到需求项。

    Collections.binarySearch如何用于LinkedList?
    对于ArrayList这样的“随机访问”列表,此方法以log(n)时间运行。如果指定的列表未实现RandomAccess接口且很大,则此方法将执行基于迭代器的二进制搜索,该搜索执行O(n)复杂度遍历,并以O(log n)元素比较。

    两个函数返回的负值的有效值是多少?
    该函数返回搜索键的索引(如果包含在数组中)。否则,(-(插入点)– 1)。插入点定义为将键插入数组的点:第一个元素的索引大于键,或者如果数组中的所有元素都小于指定键,则为a.length。请注意,这保证了当且仅当找到密钥时,返回值才会> = 0。

    如何在Java中实现我们自己的二进制搜索?

    // Java实现二进制搜索
    class BinarySearch
    {
        // 返回x的index,如果出现在 arr[l..r], 否则返回 -1
        int binarySearch(int arr[], int l, int r, int x)
        {
            if (r>=l)
            {
                int mid = l + (r - l)/2;
                // 如果元素出现在正中间
                if (arr[mid] == x)
                   return mid;
                // 如元素小于mid,它只可能在左边的subarray
                if (arr[mid] > x)
                   return binarySearch(arr, l, mid-1, x);
                // 否则只可能在右边的subarray
                return binarySearch(arr, mid+1, r, x);
            }
            // 运行到此,说明元素在array不存在
            return -1;
        }
        // 测试代码
        public static void main(String args[])
        {
            BinarySearch ob = new BinarySearch();
            int arr[] = {2,3,4,10,40};
            int n = arr.length;
            int x = 10;
            int result = ob.binarySearch(arr,0,n-1,x);
            if (result == -1)
                System.out.println("元素不存在");
            else
                System.out.println("元素被找到,index= " +
                                                     result);
        }
    }

    输出:

    元素被找到,index= 3

    Java中是否有任何功能如C++ STL的lower_bound()upper_bound()?
    在Java 9之前,Java中没有此类功能。