美文网首页
Java 实现二分查找

Java 实现二分查找

作者: 久伴我还是酒伴我 | 来源:发表于2019-05-17 11:45 被阅读0次

简介

二分查找,又叫折半查找,是一种查询效率非常高的查找算法,其实我更喜欢叫“折半查找”,一听这名字就知道每次在所有内容的前一半或者后一半进行查找。好了,下面咱们言归正传,通过简单讲解和两种方式实现的例子说明这么效率高的算法,还是老规矩,一个字:

规则

必须是有序的序列,这个规则很容易理解,要不全部是降序,要不全部是升序,不能是无规则的内容,因为要通过查询内容中的元素进行大小的判断,决定从后半部分还是前半部分进行继续查找。

优缺点

优点 缺点
比较次数少查找速度快,平均性能好 待查表为有序表,且插入删除困难

因此,折半查找方法适用于不经常变动而查找频繁的有序列表

图示说明

image.png

递归实现

 /**
     * 执行入口
     *
     * @param args
     */
    public static void main(String args[]) {
        int[] arr = {1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 13, 14, 15, 16, 18, 21, 22, 25, 28, 29, 32, 41, 46, 47, 48, 49, 50, 51, 52, 53};
        System.out.println(recursionSearch(arr, 22, 0, arr.length - 1));
    }

/**
     * 递归方式进行二分查找(折半查找)
     *
     * @param arr  数组
     * @param key  查找内容
     * @param star 查找开始下标
     * @param end  查找结束下标
     * @return
     */
    public static int recursionSearch(int[] arr, int key, int star, int end) {
        // 锁定边界 前进条件
        if (star <= end) {
            // 取中间数
            int middle = (star + end) / 2;
            // 如果查找内容小于中间数,则折半后,从前一半中再次折半查找
            if (arr[middle] > key) {
                return recursionSearch(arr, key, star, middle - 1);
                //如果查找内容大于中间数,则折半后,从后一半中再次折半查找
            } else if (arr[middle] < key) {
                return recursionSearch(arr, key, middle + 1, end);
            } else {
                // 找到对应的数后跳出
                return middle;
            }
        }
        return -1;
    }

循环方式

 /**
     * 执行入口
     *
     * @param args
     */
    public static void main(String args[]) {
        int[] arr = {1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 13, 14, 15, 16, 18, 21, 22, 25, 28, 29, 32, 41, 46, 47, 48, 49, 50, 51, 52, 53};
        System.out.println(circularSearch(arr, 22));
    }

    /**
     * while 循环方式进行二分查找(折半查找)
     *
     * @param arr 数组
     * @param key 查找内容
     * @return
     */
    public static int circularSearch(int[] arr, int key) {
        // 开始下标
        int star = 0;
        // 结束下标
        int end = arr.length - 1;
        while (star <= end) {
            //取中间数
            int middle = (star + end) / 2;
            // 如果查找内容等于数据中某一数,跳出循环返回
            if (arr[middle] == key) {
                return middle;
                // 如果查找内容小于该数,则截至下标为中间数-1
            } else if (arr[middle] > key) {
                end = middle - 1;
                // 如果查找内容大于该数,则开始下标为中间数+1
            } else if (arr[middle] < key) {
                star = middle + 1;
            }
        }
        return -1;
    }

下面来自网络摘抄,目前还没太研究时间复杂度和空间复杂度。

时间复杂度()

采用方式:分治策略
最坏的情况下两种方式时间复杂度一样:O(log2 N)

image

最好情况下为O(1)

空间复杂度

空间复杂度并不指计算实际占用的空间,而是计算整个算法的辅助空间单元的个数。

非递归方式:
由于辅助空间是常数级别的所以:
空间复杂度是O(1);

递归方式:
递归的次数和深度都是log2 N,每次所需要的辅助空间都是常数级别的:
空间复杂度:O(log2N )

结束语

如果有什么问题可以留言,大家共同学习。

相关文章

  • 二分查找

    概念二分查找又叫折半查找,从排序数组中查找元素的位置。 图示二分查找 Java实现 复杂度T(n)=T(n/2)+...

  • 面试知识点

    排序冒泡排序快速排序选择排序插入排序二路归并 查找二分查找 排序和查找的java实现 java语言Java字符串字...

  • 二分查找代码框架

    1.基本的二分查找 2.寻找左侧边界的二分查找 3.寻找右侧边界的二分查找 4.说明 这是一个Java实现的二分查...

  • 简单算法

    冒泡排序: while 实现的二分查找: 递归实现二分查找:

  • 二分查找

    定义 过程 要求 算法复杂度 Java代码实现 定义   二分查找也称折半查找(Binary Search),它是...

  • Java实现二分查找

    Java实现二分查找 二分查找针对的是一个有序的数据集合,查找思想有点类似分治思想。每次都通过跟区间的中间元素对比...

  • 算法之二分查找

    二分查找 二分查找是著名、高效并有应用广泛的查找算法。 二分常规实现 1.循环实现 下面我用python语言实现循...

  • 分治算法(swift二分法排序递归实现)

    二分查找 1、二分查找(Binary Search) 2、二分查找的基本思想 swift算法实现

  • 二分查找

    网上找到的图片便于理解 二分查找递归实现与循环实现代码: /** 二分查找 1.二分查找又称折半查找,它是一种效率...

  • 二分查找

    数据顺序存储,有序序列 O(logn) 递归实现二分查找: 非递归实现二分查找:

网友评论

      本文标题:Java 实现二分查找

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