比如现在有个记录名单的字典,里面的名字是按A-Z的顺序排好的,现在我想找Lily这个人。我可以从第一页开始一页一页的翻,但显然这样效率太低了。我可以怎么做呢?首先我直接翻到字典的中间位置,假如发现这里是字母H开头的,那么由于字典顺序是排好的,我就可以断定Lily肯定在后半本书里,前半本我就可以不看了。接着我翻到后半本书的中间,发现是字母N开头,那么我就可以断定,Lily是在这后半本书的前1/2里。依次类推,用不了几次,我就能找到Lily了。

以上所用的就是今天要说的二分查找法,可以看出,效率比一页一页的翻提高了太多。但这里我们也需要注意一点就是,我们之所以可以用这个方法查找Lily,是因为字典中的名字是排好序的,如果是乱序,用这种方法肯定就不行了。

这里我们以一个有序的数列来介绍这个查找法:比如要查找62这个数。

[3 17 21 37 45 52 62 78 83 95]

我们记录一个最高位95下标为9,最低位3下标为0,中间位下标=(最低位+最高位)/2取整,即为4.然后我们去中间位的数,也即下标为4对应的数45,由于45小于62,我们让最低位=中间位+1,也就是5,这样能重写中间位为(5+9)/2=7,也就取得了7对应的数78,78大于62,我们让最高位=中间位-1,也就是6,这样重写取中间位(5+6)/2=5,这样又取到了52,小于62,重写计算最低位为6,此时最高位等于最低位了,就得到了我们要的最终的值。当然如果在上一步计算的中间值正好是我们要的62,就讲这个数拿出就可了。

语言显得啰嗦且不一定能看懂,还是看代码吧:

package com.cloud.algorithm;
public class TestBinarySearch {public static int binarySearch(int[] arr,int dest){int lower = 0;int upper = arr.length;while (lower <= upper) {int mid = (lower + upper) / 2;if (arr[mid] < dest) {lower = mid + 1;} else if (arr[mid] > dest) {upper = mid - 1;}else {return mid;}}return -1;}public static void main(String[] args) {int[] niArr = { 3, 17, 21, 37, 45, 52, 62, 78, 83, 95 };int niDestIndex = binarySearch(niArr, 62);if(niDestIndex==-1){System.out.println("没找到");}else{System.out.println("下标为:"+niDestIndex);}}
}

其实对于java而已,已经为我们封装太多的功能,提供了大量的算法:

package com.cloud.algorithm;
import java.util.Arrays;
public class TestArrays {public static void main(String[] args) {int[] niArr = { 78, 83, 17, 45, 52, 21, 3, 37, 62, 95 };// 将乱序的数组升序排列Arrays.sort(niArr);// 格式化输出排好序的数组System.out.println(Arrays.toString(niArr));// 在指定排好序数组中按照二分查找法查找某元素的下标int niIndex = Arrays.binarySearch(niArr, 62);System.out.println("所查元素下标为:"+niIndex);}
}

转载于:https://blog.51cto.com/632977922/1324144

java算法2_二分查找法相关推荐

  1. java二分查找法_java算法之二分查找法的实例详解

    java算法之二分查找法的实例详解 原理 假定查找范围为一个有序数组(如升序排列),要从中查找某一元素,如果该元素在此数组中,则返回其索引,否则返回-1.通过数组长度可取出中间位置元素的索引,将其值与 ...

  2. javascript数据结构与算法---检索算法(二分查找法、计算重复次数)

    javascript数据结构与算法---检索算法(二分查找法.计算重复次数) /*只需要查找元素是否存在数组,可以先将数组排序,再使用二分查找法*/ function qSort(arr){if (a ...

  3. binarysearch java,java数据结构之二分查找法 binarySearch的实例

    java数据结构之二分查找法 binarySearch的实例 折半查找法,前提是已经排好序的数组才可查找 实例代码: public class BinarySearch { int[] bArr; p ...

  4. 经典算法之二分查找法(俗称基本二分搜索法)

    经典算法之二分查找法(俗称二分搜索法) 文章目录 经典算法之二分查找法(俗称二分搜索法) 前言 一.什么是二分查找法? 二.代码实现 总结 前言 就算法而言,我们主要学习的是数学+思维+逻辑+数据结构 ...

  5. 【经典排序算法】二分查找法 (动图演示 + C 语言代码实现)

    [经典排序算法]二分查找法 (动图演示 + C 语言代码实现)   

  6. 每天5分钟玩转python3算法:二分查找法

    从今天开始,博主准备开始一段常见算法的学习,算法实现使用Python3,希望坚持下去^_^ alg1:二分查找法 1.运行时间 二分查找相比于依次查找,查询速度提升明显: + 依次查找:O(n) + ...

  7. 【javascript算法】二分查找法

    目录 1.二分查找算法 1.1定义 1.2流程图 1.3查找过程 2.javascript的实现 2.1 源码 2.2测试结果 2.3拓展题 1.二分查找算法 本文是根据有序数组升序的顺序来实现的 1 ...

  8. 二分查找法。Java泛型设计二分查找法。

    前言基础: 1.只能针对有序的数组进行查找. 2.时间复杂度为O(logn). 3.使用前可以先排序,然后再查找,广泛应用于当一大组数据需要频繁查找,于是我们先将其进行排序,然后再通过二分查找进行查找 ...

  9. 数据结构与算法之二分查找法

    public static void main(String[] args) {         //目标数组         int[] arr = new int[] {1,2,3,4,5,6,7 ...

最新文章

  1. IBM服务器以及本地PC机安装suse linux,oracle测试,遇到的问题有:
  2. 浅析丨AI安防产品发展现状与趋势分析
  3. 【转】全排列算法非递归实现和递归实现
  4. Csharp 打印Word文件默認打印機或選擇打印機設置代碼
  5. Objective-C 中自动生成 setter getter 方法
  6. word公式编号怎么右对齐_8个能帮你大忙的Word技巧,建议花几分钟学起来!
  7. leetcode刷题:零钱兑换
  8. MySQL命令窗口出现中文乱码的解决方法
  9. json在java中的使用_有效地使用JSON流(在Java中)
  10. php serialize error at offset,unserialize(): Error at offset出现的原因分析以及解决方法
  11. Eclipse 工程迁移到 Android Studio
  12. linus系统安装mysql_linux安装MYSQL
  13. R语言查看某个R包版本号
  14. Matlab plot画图线型、符号及颜色
  15. 如何批量将多个Excel文件转换为PDF - 批量Excel转PDF转换器快速教程
  16. 思维导图c语言java区别_C语言基本数据类型的思维导图
  17. java伪随机数概率_抽奖伪随机数生成器(Java)
  18. html在页面显示一个正方形,CSS实现一个自适应的正方形的方法示例
  19. 详细理解JS的三座大山
  20. 2021年茶艺师(初级)考试题及茶艺师(初级)最新解析

热门文章

  1. nagios学习笔记(二)
  2. asp获取ftp服务器目录并显示_用 Python 快速实现 HTTP 和 FTP 服务器
  3. 操作索引库-mapping属性
  4. Nginx服务器版本升级需求分析
  5. 类文件到虚拟机(类加载机制)
  6. ConcurrentHashMap的源码分析-transfer
  7. Spring 中的编程思想总结
  8. 返回结果数据实体类R
  9. Java实现消息发送
  10. 方法入门_方法的调用