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分别 ...
随机推荐
- Python—异步任务队列Celery简单使用
一.Celery简介 Celery是一个简单,灵活,可靠的分布式系统,用于处理大量消息,同时为操作提供维护此类系统所需的工具.它是一个任务队列,专注于实时处理,同时还支持任务调度. 中间人boker: ...
- EditText制作简单的登录界面
EditText与之前的TextView和Button的用法大体相同,用法案例如下: activity_edit_text.xml: <?xml version="1.0" ...
- 16. docker 网络 端口映射
一.本地操作 1.如何将 nginx 暴露给外界 创建 nginx 服务器 docker run --name web -d nginx 查看 nginx 的 ip地址 docker network ...
- 1.2 NumPy数组基础
目录 第一章 numpy入门 1.2 numpy数组基础 1.2.1 数组的属性 1.2.2 数组的索引:获取单个元素 1.2.3 数组切片:获取子数组 1.2.4 数组的变形 1.2.5 数组的拼接 ...
- php 去除中间空格
<?php $str = 'a b c d e'; echo preg_replace('# #','',$str);//输出 "abcde"
- UVA 10273
我是用暴力过的,虽然网上说刘汝佳出的这道题考的是堆,我不太懂,..用暴力时间复杂度高一些,但是一样能过 所要注意的就是周期问题,因为只要同时存在某一天超过一头牛产奶量最小,就不会杀牛,而每头牛的周期和 ...
- Mybatis学习——初始MyBatis
什么是MyBatis框架? MyBatis框架是一种ORM(既对象关系映射)框架. 什么是ORM框架? 是一种为了解决面向对象与关系数据库之间数据不匹配的技术,它通过描述Java对象和关系数据库表之间 ...
- PAT Advanced 1015 Reversible Primes (20) [素数]
题目 A reversible prime in any number system is a prime whose "reverse" in that number syste ...
- vue执行期间的函数
先放上vue官方给的函数图
- 项目开发git-短信验证-redis数据库
项目开发git操作 基本流程 """ 1.开发前,拉一次远程仓库 2.工作区进行开发 3.将开发结果提交到本地版本库 - git status查看时没有待处理的事件 4. ...