二分查找法

二分查找法

二分法就是一种在有序数组中查找某一特定元素的搜索算法

搜索过程从数组的中间元素开始:

  • 如果中间元素正好是要查找的元素,则搜索过程结束
  • 如果某一特定元素大于或小于中间元素,则在数组大于或小于中间元素的那一半查找,而且和开始一样从中间元素开始比较
  • 如果在某一步骤数组为空,则代表元素找不到.

复杂度

二分查找法_第1张图片

算法步骤

给定一个数组A,目标值为T,查找T在A中的位置

  1. 令L为0,R为n-1.
  2. 如果L>R,则搜索以失败告终
  3. 令m(中间值元素)为"(L+R)/2".
  4. 如果Am
  5. 如果Am>T,令R为m-1,并回到步骤2
  6. 当Am=T, 搜索结束,回传值m.
    /**
     * 二分法
     *
     * @param array 目标数组
     * @param t     要查找的值
     */
    private static int dichotomy(int[] array, int t) {
        int l = 0;
        int r = array.length - 1;
        
        while (l < r) {
            int m = (l + r) / 2;
            if (t < array[m]) {
                r = m - 1;
            } else if (t > array[m]) {
                l = m + 1;
            } else {
               return m;
            }
        }
        return -1;
    }

使用二分法的先决条件

  • 有序数组 : 因为我们要选择一个中间元素,有序才能保证算法的有效性 ; 二分法基于下标访问元素,所以在其他数据结构(如链表类)就不要用二分法
  • 注意数据类型是有范围的,采用L+(R-L)/2表达式更合适
  • 注意l=m+1 和 r = mid - 1防止死循环
  • 数据量不要过大:因为二分法会把数组全部放入内存中

你可能感兴趣的:(算法)