美文网首页
查找-二分查找

查找-二分查找

作者: sjandroid | 来源:发表于2018-06-05 11:30 被阅读0次

写在前边的话:今天记录一下关于算法中 二分查找 的一些理解和心得。
主要分为以下几个方面分享

  • 二分查找的思想
  • 实现方式
  • 时间复杂度

二分查找的思想

1:在一个 有序且采用顺序结构存储的线性表中,取 中间记录给定对象 相比较。
2:若 中间记录与给定对象值 相等,则表示查找成功,并返回中间记录的下标。
3:若 中间记录比给定对象值 小,则在中间记录的 右半区继续查找。
4:若 中间记录比给定对象值 大,则在中间记录的 左半区继续查找。
5:不断重复上述1~4步骤,直至查找成功或者失败为止。


实现方式

    public static void main(String[] args){
        Integer[] array = Util.createRandomArray(100, 20);
        Util.sysSort(array);

        Integer[] array1 = Arrays.copyOf(array, array.length);
        Integer[] array2 = Arrays.copyOf(array, array.length);

        Util.print(Arrays.toString(array) + "================================", "数据源");
        int searchNum = 37;

        int index = binarySearch(array1, searchNum);
        Util.print("结果:" + (index >= 0 ? "找到" + searchNum + ",它的下标为:" + index : "没找到!"), "binarySearch()");

        Util.print("================================", "");
        int index2 = Util.sysBinarySearch(array2, searchNum);
        Util.print("结果:" + (index2 >= 0 ? "找到" + searchNum + ",它的下标为:" + index2 : "没找到!"), "Util.sysBinarySearch()");

    }

    private static int binarySearch(Integer[] array, Integer searchNum){
        Util.checkArrayISNull(array);
        Util.checkSrcIsNull(searchNum);

        int searchNumIndex = -1;

        int low = 0; //记录查找区域的最小边界值
        int high = array.length - 1; //记录查找区域的最大边界值
        while (low <= high){
            int mid = (low + high) >> 1; //中间记录的下标

            System.out.println("low:" + low + ", high:" + high + ", mid:" + mid);

            if(searchNum < array[mid]){ //给定值比中间记录小,说明给定值在中间记录的左半区域,此时high对应的下标应该是mid的前一位数据对应的下标
                high = mid - 1;
            } else if(searchNum > array[mid]){ //给定值比中间记录大,说明给定值在中间记录的右半区域,此时low对应的下标应该是mid的后一位数据对应的下标
                low = mid + 1;
            } else { //查找成功
                searchNumIndex = mid;
                break;
            }
        }

        return searchNumIndex;
    }

    public static int sysBinarySearch(Integer[] src, Integer searchNum){
        checkArrayISNull(src);
        checkSrcIsNull(searchNum);

        int index = -1;

        index = Arrays.binarySearch(src, searchNum);

        return index;
    }

log

数据源:[6, 10, 12, 17, 18, 24, 26, 33, 37, 42, 46, 47, 51, 55, 66, 66, 69, 70, 82, 95]================================
low:0, high:19, mid:9
low:0, high:8, mid:4
low:5, high:8, mid:6
low:7, high:8, mid:7
low:8, high:8, mid:8
binarySearch():结果:找到37,它的下标为:8
:================================
Util.sysBinarySearch():结果:找到37,它的下标为:8

时间复杂度

O(logn)

相关文章

  • python二分查找算法

    文章概述 二分查找法介绍 简单查找与二分查找对比 二分查找  二分查找算法主要思想:在有序列表中查找指定元素,先从...

  • 数据结构和算法--二分查找

    二分查找 二分查找的思想 二分查找(Binary Search)算法,也叫折半查找算法。 二分查找针对的是一个有序...

  • 二分查找

    什么是二分查找?二分查找,也叫折半查找(Binary Search),它是一种效率较高的查找方法。二分查找的条件:...

  • 可查找重复元素的二分查找算法

    可查找重复元素的二分查找算法 二分查找算法思想:又称为 折半查找,二分查找适合对已经排序好的数据集合进行查找。假设...

  • day13

    查找算法 顺序查找 二分查找 差值查找 斐波那契查找 二分查找 前提数组必须是有序的。 升级 Interpolat...

  • 二分查找的循环写法与递归写法

    二分查找 二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。但二分查找要求线性表必须...

  • 二分查找

    [TOC] 二分查找的基础模板 二分查找靠左的Index基础模板 二分查找靠右的Index基础模板 二分查找插入t...

  • 二分查找法

    二分查找法 二分查找法(递归)

  • 二分查找(递归、非递归)

    二分查找(递归) 二分查找(非递归)

  • 二分查找(递归、非递归)

    二分查找(递归) 二分查找(非递归)

网友评论

      本文标题:查找-二分查找

      本文链接:https://www.haomeiwen.com/subject/ptjpsftx.html