当前位置: 首页 > news >正文

二分搜索法(转载)

二分查找算法java实现

1、算法概念。

二分查找算法也称为折半搜索、二分搜索,是一种在有序数组中查找某一特定元素的搜索算法。请注意这种算法是建立在有序数组基础上的。

2、算法思想。

①搜素过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜素过程结束;

②如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。

③如果在某一步骤数组为空,则代表找不到。

这种搜索算法每一次比较都使搜索范围缩小一半。

3、实现思路。

①找出位于数组中间的值,并存放在一个变量中(为了下面的说明,变量暂时命名为temp);

②需要找到的key和temp进行比较;

③如果key值大于temp,则把数组中间位置作为下一次计算的起点;重复① ②。

④如果key值小于temp,则把数组中间位置作为下一次计算的终点;重复① ② ③。

⑤如果key值等于temp,则返回数组下标,完成查找。

4、实现代码。

/**
     * description : 二分查找。
     * @autor kwzhang
     * modify :2012-6-29
     *
     * @param <E>
     * @param array 需要查找的有序数组
     * @param from 起始下标
     * @param to 终止下标
     * @param key 需要查找的关键字
     * @return
     * @throws Exception
     */
    public static <E extends Comparable<E>> int binarySearch(E[] array, int from, int to, E key) throws Exception {
        if (from < 0 || to < 0) {
            throw new IllegalArgumentException("params from & length must larger than 0 .");
        }
        if (from <= to) {
            int middle = (from >>> 1) + (to >>> 1); // 右移即除2
            E temp = array[middle];
            if (temp.compareTo(key) > 0) {
                to = middle - 1;
            } else if (temp.compareTo(key) < 0) {
                from = middle + 1;
            } else {
                return middle;
            }
        }
        return binarySearch(array, from, to, key);
    }

上面这种实现是通过递归的方式,各人觉得之类的问题用递归比较好理解,而且过程简单。

下面再来看看非递归的方式如何实现。在JDK里面正好有实现,在此就直接贴上Arrays里面的代码。为了简单起见,我们就只看看int参数的方法:

private static int binarySearch0(int[] a, int fromIndex, int toIndex, int key) {
    int low = fromIndex;
    int high = toIndex - 1;
    while (low <= high) {
        int mid = (low + high) >>> 1;
        int midVal = a[mid];
        if (midVal < key)
        low = mid + 1;
        else if (midVal > key)
        high = mid - 1;
        else
        return mid; // key found
    }
    return -(low + 1);  // key not found.
    } 

 

转载于:https://www.cnblogs.com/zhuxiaolin/p/4864467.html

相关文章:

  • SEO
  • nginx配置
  • iOS 开发笔记-报错处理
  • 北理工 Java 技术与应用考试试题参考答案及点评(下)
  • Java学习笔记--Java8 Lambda表达式
  • 时间是幻觉?
  • getHibernateTemplate()与getSession()的区别
  • 宇宙最初几微秒
  • VirtualBox 自动挂载共享文件夹
  • 一切都是相对的标准
  • 本地通知UILocalNotification
  • centos下/etc/sysconfig/下找不到iptables文件
  • ifconfig命令
  • S3C2440-LCD字符显示
  • 链表与哈希表基本概念及Java常用集合
  • Apache Pulsar 2.1 重磅发布
  • co模块的前端实现
  • leetcode46 Permutation 排列组合
  • Netty+SpringBoot+FastDFS+Html5实现聊天App(六)
  • 不用申请服务号就可以开发微信支付/支付宝/QQ钱包支付!附:直接可用的代码+demo...
  • -- 查询加强-- 使用如何where子句进行筛选,% _ like的使用
  • 程序员该如何有效的找工作?
  • 对超线程几个不同角度的解释
  • 聚类分析——Kmeans
  • 数据仓库的几种建模方法
  • 通信类
  • 微信小程序:实现悬浮返回和分享按钮
  • 携程小程序初体验
  • 译有关态射的一切
  • 用mpvue开发微信小程序
  • 1.Ext JS 建立web开发工程
  • ​如何防止网络攻击?
  • ###51单片机学习(2)-----如何通过C语言运用延时函数设计LED流水灯
  • #在线报价接单​再坚持一下 明天是真的周六.出现货 实单来谈
  • (20050108)又读《平凡的世界》
  • (3)llvm ir转换过程
  • (C#)一个最简单的链表类
  • (C语言版)链表(三)——实现双向链表创建、删除、插入、释放内存等简单操作...
  • (二)WCF的Binding模型
  • (附源码)python旅游推荐系统 毕业设计 250623
  • (附源码)spring boot智能服药提醒app 毕业设计 102151
  • (牛客腾讯思维编程题)编码编码分组打印下标(java 版本+ C版本)
  • (入门自用)--C++--抽象类--多态原理--虚表--1020
  • (四)Controller接口控制器详解(三)
  • (提供数据集下载)基于大语言模型LangChain与ChatGLM3-6B本地知识库调优:数据集优化、参数调整、Prompt提示词优化实战
  • (原創) 如何使用ISO C++讀寫BMP圖檔? (C/C++) (Image Processing)
  • (转)linux自定义开机启动服务和chkconfig使用方法
  • (转)scrum常见工具列表
  • (最简单,详细,直接上手)uniapp/vue中英文多语言切换
  • .NET Framework 和 .NET Core 在默认情况下垃圾回收(GC)机制的不同(局部变量部分)
  • .Net Web项目创建比较不错的参考文章
  • .net 使用ajax控件后如何调用前端脚本
  • .net/c# memcached 获取所有缓存键(keys)
  • .NET/C# 在代码中测量代码执行耗时的建议(比较系统性能计数器和系统时间)...
  • .NET6 开发一个检查某些状态持续多长时间的类