java算法2_二分查找法
比如现在有个记录名单的字典,里面的名字是按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_二分查找法相关推荐
- java二分查找法_java算法之二分查找法的实例详解
java算法之二分查找法的实例详解 原理 假定查找范围为一个有序数组(如升序排列),要从中查找某一元素,如果该元素在此数组中,则返回其索引,否则返回-1.通过数组长度可取出中间位置元素的索引,将其值与 ...
- javascript数据结构与算法---检索算法(二分查找法、计算重复次数)
javascript数据结构与算法---检索算法(二分查找法.计算重复次数) /*只需要查找元素是否存在数组,可以先将数组排序,再使用二分查找法*/ function qSort(arr){if (a ...
- binarysearch java,java数据结构之二分查找法 binarySearch的实例
java数据结构之二分查找法 binarySearch的实例 折半查找法,前提是已经排好序的数组才可查找 实例代码: public class BinarySearch { int[] bArr; p ...
- 经典算法之二分查找法(俗称基本二分搜索法)
经典算法之二分查找法(俗称二分搜索法) 文章目录 经典算法之二分查找法(俗称二分搜索法) 前言 一.什么是二分查找法? 二.代码实现 总结 前言 就算法而言,我们主要学习的是数学+思维+逻辑+数据结构 ...
- 【经典排序算法】二分查找法 (动图演示 + C 语言代码实现)
[经典排序算法]二分查找法 (动图演示 + C 语言代码实现)
- 每天5分钟玩转python3算法:二分查找法
从今天开始,博主准备开始一段常见算法的学习,算法实现使用Python3,希望坚持下去^_^ alg1:二分查找法 1.运行时间 二分查找相比于依次查找,查询速度提升明显: + 依次查找:O(n) + ...
- 【javascript算法】二分查找法
目录 1.二分查找算法 1.1定义 1.2流程图 1.3查找过程 2.javascript的实现 2.1 源码 2.2测试结果 2.3拓展题 1.二分查找算法 本文是根据有序数组升序的顺序来实现的 1 ...
- 二分查找法。Java泛型设计二分查找法。
前言基础: 1.只能针对有序的数组进行查找. 2.时间复杂度为O(logn). 3.使用前可以先排序,然后再查找,广泛应用于当一大组数据需要频繁查找,于是我们先将其进行排序,然后再通过二分查找进行查找 ...
- 数据结构与算法之二分查找法
public static void main(String[] args) { //目标数组 int[] arr = new int[] {1,2,3,4,5,6,7 ...
最新文章
- IBM服务器以及本地PC机安装suse linux,oracle测试,遇到的问题有:
- 浅析丨AI安防产品发展现状与趋势分析
- 【转】全排列算法非递归实现和递归实现
- Csharp 打印Word文件默認打印機或選擇打印機設置代碼
- Objective-C 中自动生成 setter getter 方法
- word公式编号怎么右对齐_8个能帮你大忙的Word技巧,建议花几分钟学起来!
- leetcode刷题:零钱兑换
- MySQL命令窗口出现中文乱码的解决方法
- json在java中的使用_有效地使用JSON流(在Java中)
- php serialize error at offset,unserialize(): Error at offset出现的原因分析以及解决方法
- Eclipse 工程迁移到 Android Studio
- linus系统安装mysql_linux安装MYSQL
- R语言查看某个R包版本号
- Matlab plot画图线型、符号及颜色
- 如何批量将多个Excel文件转换为PDF - 批量Excel转PDF转换器快速教程
- 思维导图c语言java区别_C语言基本数据类型的思维导图
- java伪随机数概率_抽奖伪随机数生成器(Java)
- html在页面显示一个正方形,CSS实现一个自适应的正方形的方法示例
- 详细理解JS的三座大山
- 2021年茶艺师(初级)考试题及茶艺师(初级)最新解析