二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。

  二分查找思路非常简单,由粗暴的遍历查找改为了将元素排序后不断的进行折半查找,将搜索的时间复杂度由O(N)降到了O(log2N)。

  二分查找的思路与二叉查找树的查找过程完全相同,我们将一个经过排序的数组看做一棵平衡的二叉查找树,那么数组的中点便是树的根节点。折半后的中点是下一层子树的根节点,以此类推。我们通过不断的判断目标值与各树根节点的值的大小来决定下一步查找根节点的左子树还是右子树。

  在实现时,我们可以维护两个指针left和right,指针之间的范围便是我们的查找范围。查找过程如下:

  首先判断边界条件,left位置的值与right位置的值是否包含目标值,若包含则查找结束;

    通过left与right的位置找到当前范围的中点mid,即mid的值为(left+right)/2;

    如果mid的值便是target的值,查找结束;

    如果left与right已经是相邻的元素,那么证明数组中没有目标值,查找结束;

    如果目标值大于mid则在mid、right间继续查找,即将mid的值赋予left;

    反之在left与mid间继续查找,即将mid的值赋予right;

  left指针与right指针的移动如下图所示(例子为在目标数组中查找20):

  

  大于mid则在mid、right间继续查找,即将上次查找的mid值赋予left:

  

  同上:

  

  同上:

  

  此时left与right相邻,仍未找到目标值,即数组中没有包含目标值。

  代码实现如下,值得注意的是,(left+right)/2有可能会造成整数溢出问题,我们可改写为left+(right-left)/2来防止该问题,下面看代码

/**
* @Author Nyr
* @Date 2019/11/18 20:29
* @Description 二分查找,找到target返回target的索引,未找到返回-1
*/
class MidFind {
public static void main(String[] args){
int[] nums={-5,0,1,2,3,5,7,9,10,15,20,28,50,56};
System.out.println(searchInsert(nums,56,0,nums.length-1));
} public static final int searchInsert(int[] nums, int target,int left,int right) {
if(nums==null){
throw new NullPointerException("目标数组为空!");
}
//边界条件
if(target>nums[right]||target<nums[left]){return -1;}
if(right==left&&nums[left]!=target){return -1;}
if(nums[left]==target){return left;}
if(nums[right]==target){return right;}
while(true){
//计算当前中点
int mid=left+(right-left)/2;
//找到目标值
if(target==nums[mid]){
return mid;
}
//未找到目标值但终止循环
if(right==left+1){
return -1;
}
if(target>nums[mid]){
left=mid;
}
if(target<nums[mid]){
right=mid;
}
}
}
}

二分查找java实现的更多相关文章

  1. 数据结构之二分查找——Java语言实现

    场景描述:给出一个数据序列长度为N,然后查找 一个数是否在数据序列中,若是,则返回在序列中的第几个位置. 首先可能第一个想到的就是按照顺序,从前到后一个一个进行查找,直到找到为止,若最后都没有,则说明 ...

  2. 数据结构和算法设计专题之---二分查找(Java版)

    1.前提:二分查找的前提是需要查找的数组必须是已排序的,我们这里的实现默认为升序 2.原理:将数组分为三部分,依次是中值(所谓的中值就是数组中间位置的那个值)前,中值,中值后:将要查找的值和数组的中值 ...

  3. 二分查找(Java)

    二分查找的前提的要查找的数组必须有序. 代码如下: 程序1 public class source { public int binary_sort(int[] array, int item) { ...

  4. 二分查找(Java实现)

    二分查找:递归实现 public class BinarySearch { /** * @param arr 代查找的数组,需要有序 * @param left 查找区间的左界限 * @param r ...

  5. 二分查找-Java版

    /** * * 二分查找算法 * * * * @param srcArray 有序数组 * * @param target 查找元素 * * @return srcArray数组下标,没找到返回-1 ...

  6. 快速排序和二分查找(Java)

    import java.util.Arrays; public class Main { public static void main(String[] args) { int[] data = { ...

  7. 二分查找java代码

    public int find(long searchKey){ int i; int begin = 0; int end = nElems - 1; while(true){ i = (begin ...

  8. 从三数之和看如何优化算法,递推-->递推加二分查找-->递推加滑尺

    人类发明了轮子,提高了力的使用效率. 人类发明了自动化机械,将自己从重复的工作中解脱出来. 提高效率的方法好像总是离不开两点:拒绝无效劳动,拒绝重复劳动.人类如此,计算机亦如是. 前面我们说过了四数之 ...

  9. Java实现的二分查找算法

    二分查找又称折半查找,它是一种效率较高的查找方法. 折半查找的算法思想是将数列按有序化(递增或递减)排列,查找过程中采用跳跃式方式查找,即先以有序数列的中点位置为比较对象,如果要找的元素值小 于该中点 ...

随机推荐

  1. 使用Linq判断DataTable数据是否重复

    我们一般系统在导入数据的时候,一般都是通过NPOI将excel数据转换成DataTable,然后将DataTable导入到数据库.在数据导入的过程中,其实很重要的一部就是检查DataTable中的数据 ...

  2. HTML连载28-标签的权重

    一.什么是优先级的权重 1.作用:当多个选择器混合在一起的时候,我们可以通过计算权重来判断谁的优先级最高. 2.权重的计算规则 公共代码: <body> <div id=" ...

  3. 大话设计模式Python实现-装饰模式

    装饰模式(Decorator Pattern):动态的给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活. 下面是一个给人穿衣服的过程,使用装饰模式: #!/usr/bin/en ...

  4. redis 清除minerd进程的方法

    redis 清除minerd进程的方法 1 修改redis配置文件 //禁止高危命令rename-command FLUSHALL ""rename-command CONFIG ...

  5. Hash函数浅谈

    Hash函数是指把一个大范围映射到一个小范围.把大范围映射到一个小范围的目的往往是为了节省空间,使得数据容易保存. 除此以外,Hash函数往往应用于查找上.所以,在考虑使用Hash函数之前,需要明白它 ...

  6. day06——小数据池、深浅拷贝、集合

    day06 小数据池 小数据池--缓存机制(驻留机制),只是一种规格,不会实际的开辟一个空间 == 判断两边内容是否相等 ***** # a = 10 # b = 10 # print(a == b) ...

  7. 关于NB-IoT,没有比这篇更通俗易懂的啦!

    来源:内容来自「鲜枣课堂」,谢谢. 大家好,我是小枣君. 今天,我是来“吹NB”的.嗯,标题已经剧透了,这个NB,就是NB-IoT. 在过去的一年多,NB-IoT真的可以说是大红大紫.在通信圈里,除了 ...

  8. spring好文章整理

    彻底搞明白Spring中的自动装配和Autowired IDEA编译spring 5源码 Spring源码——IDEA读Spring源码环境搭建 导入spring源码org.springframewo ...

  9. Delphi编译/链接过程

    下面展示了Delphi是怎样编译源文件,并且把它们链接起来,最终形成可执行文件. 当Delphi编译项目(Project)时,将编译项目源文件.窗体单元和其他相关单元,在这个过程中将会发生好几件事情: ...

  10. 将MySQL升级到8.0.x后的遇到到错误及解决

    一,安装的时遇到的坑 我下的是Mysql 8.0.13 地址:https://dev.mysql.com/downloads/mysql/ 下的是解压版(个人能不用安装就不想用安装版的强迫症(/▽\) ...