java 二分法查找原理
二分法查找原理:
1、只要低位下标不大于高位下标,就进行二分查找(步骤1-3)
2、先在有序的数组中对半查找中间的坐标,如果中标和要查找的下标相等时,找到目标数,那二分结束。
3、如果步骤2没有找到,那就会出现先2种情况:a、中标大于find值;b、中标小于find值;
3.1、如果中标大于find值,说明find值在中标的左边,那么高位就是此时的中标,然后继续二分
3.2、如果中标小于find值,说明find值在中标的右边,那么低位就是此时的中标,然后继续二分
4、如果低位下标大于高位下标:那就是没有这个想要查找的find值,且低位和高位一定是相挨着(类似:low[4],high[3],返回-5)。返回此find值本应插入的 负下标-1即:-low - 1
二分法查找缺点:
1、数组必须是有序的数组。
二分法查找的优点:
1、查找次数少,效率高。
案例:
import java.util.Arrays; public class TestBinarySearch {
public static void main(String[] args) {
int [] arr={5,13,19,21,37,56,64,75,80,88,92}; //数组必须是有序的 int low = 0; //低位
int high = arr.length; //高位
int mid = 0; //可以随便给中位赋值下标 int find = 37; //查找值 boolean flag = false; while(low <= high){ //只要高位边不比低位小,就继续二分
mid = (low + high)/2; //二分后有三种情况:中位比find值大;中位比find值小;中位和find值相等 if(arr[mid] > find){ //二分之后中位比find值大,说明find值在中位的右边,那么高位就是此时的中位,然后继续二分
high = mid - 1; }else if(arr[mid] < find){ //二分后中位比find值小,说明find值在中位的左边,那么低位就是此时的中位,然后继续二分
low = mid + 1;
}else{ //当中位和find值相等时,找到find值所对应的下标,二分结束
flag = true;
System.out.println(mid);
break;
} } if(flag){
System.out.println("mid=" + mid +"========"+ "find="+ arr[mid]);
}else{
System.out.println(-low - 1); //如果没找到,那肯定是低位大于了高位,且低位和高位相挨着,返回没有找到的find值应该所在的下标位置(即-low - 1)
}
}
}
java 二分法查找原理的更多相关文章
- Java 二分法查找
算法:当数据量很大适宜采用该方法.采用二分法查找时,数据需是有序不重复的. 基本思想:假设数据是按升序排序的,对于给定值 x,从序列的中间位置开始比较,如果当前位置值等于 x,则查找成功:若 x 小于 ...
- Java二分法查找
二分法查找 /** * 二分法查找 找不到返回-1 * @author yangzi * */ public class TwoFind { public static int twoFind(int ...
- Java - 二分法查找(尚学堂第七章数组)
import java.util.Arrays; public class TestBinarySearch { public static void main(String[] args) { in ...
- java二分法查找实现代码
package util; class BinarySearch { static int binarySearch(int[] array,int goal){//传入排好序的数组和目标数字 int ...
- java基础-数组的折半查找原理
java基础-数组的折半查找原理 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 如果让你写一个数组的查找功能,需求如下:在一个数组中,找一个元素,是否存在于数组中, 如果存在就返回 ...
- Java中数组二分法查找
算法:当数组的数据量很大适宜采用该方法.采用二分法查找时,数据需是有序不重复的,如果是无序的也可通过选择排序.冒泡排序等数组排序方法进行排序之后,就可以使用二分法查找. 基本思想:假设数据是按升序排序 ...
- Java基础(50):二分法查找的非递归实现和递归实现(完整代码可运行,参考VisualGO理解更佳)
一.概念 二分查找算法也称折半查找,是一种在有序数组中查找某一特定元素的搜索算法. 二.算法思想 搜素过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜素过程结束:如果某一特定元素大于或者 ...
- Java冒泡排序与二分法查找的代码随笔
package javafirst; import java.util.Arrays; class MaoPao{ //升序排列 /** * @param arr 要排序的数组 * @return i ...
- java算法-二分法查找实现
什么是二分法查找 首先,使用二分法查找的前提是:被查找的数组已排好序 具体实现: 假如有一组数为3,12,24,36,55,68,75,88要查给定的值24.可设三个变量front,mid,end分别 ...
随机推荐
- 18 11 05 继续补齐对python中的class不熟悉的地方 和 pygame 精灵
---恢复内容开始--- class game : #历史最高分----- 是定义类的属性 top_score =0 def __init__(self, player_name) : #是定义的实例 ...
- POJ 2976 Dropping tests【0/1分数规划模板】
传送门:http://poj.org/problem?id=2976 题意:给出组和,去掉对数据,使得的总和除以的总和最大. 思路:0/1分数规划 设,则(其中等于0或1) 开始假设使得上式成立,将从 ...
- coures包下载和安装 可解决报错ImportError: No module named '_curses'
http://blog.csdn.net/liyaoqing/article/details/54949253 coures curses 库 ( ncurses )提供了控制字符屏幕的独立于终端的方 ...
- 第4章 ZK基本特性与基于Linux的ZK客户端命令行学习
第4章 ZK基本特性与基于Linux的ZK客户端命令行学习 4-1 zookeeper常用命令行操作 4-2 session的基本原理与create命令的使用
- SYN洪泛(dos)攻击和DDOS攻击
在TCP三次握手中,服务器为了响应一个收到的SYN,分配并初始化连接变量和缓存,然后服务器发送一个SYNACK进行响应,并等待来自客户的ACK报文段,如果客户不发送ACK来完成该三次握手,最终,服务器 ...
- 如何判断Office是32位还是64位?
对于持续学习VBA的老铁们,有必要了解Office的位数. 如果系统是32位的,则不需要判断Office位数了,因为只能安装32位Office. 下面只讨论64位系统中,Office的位数判断问题. ...
- PHP系列 | ThinkPHP5.1 如何自动加载第三方SDK(非composer包 )
注意:这里只是针对于非Composer 安装包的自动加载的实现,能用composer安装的自动跳过. 由于ThinkPHP5.1 严格遵循PSR-4规范,不再建议手动导入类库文件,所以新版取消了Loa ...
- aiohttp web服务端(server)样例 (非client)
python版本 python3.6 (其他版本需要小改,版本>python3.4) 参考网址:https://www.cnblogs.com/ameile/p/5589808.html as ...
- uniapp结合小程序第三方插件“WechatSI”实现语音识别功能,进而实现终端控制
最近在用soket实现终端控制器的功能,然后就想用语音控制,这样显得更AI WechatSI在manifest.json中配置: 在vue中插入如下展示代码: <view class=" ...
- 14 微服务电商【黑马乐优商城】:day03-springcloud(Hystix,Feign)
本项目的笔记和资料的Download,请点击这一句话自行获取. day01-springboot(理论篇) :day01-springboot(实践篇) day02-springcloud(理论篇一) ...