二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。

二分查找的基本思想是将n个元素分成大致相等的两部分,取a[n/2]与x做比较,如果x=a[n/2],则找到x,算法中止;如果x<a[n/2],则只要在数组a的左半部分继续搜索x,如果x>a[n/2],则只要在数组a的右半部搜索x。


提示:二分查找法的带查表必须为有序数列

如待查数列为:6, 12, 33, 87, 90, 97, 108, 561

查找108这个数字

第一次:start=0,end=7,middle=(0+7)/2=3,中值=arr[3]=87,87<108,在中值后边查找。

第二次:start=3+1,middle=(4+7)/2=5,中值=arr[5]=97,108>97,在中值后边查找。

第三次:start=5+1=6,中值=arr[6]=108,返回查找结果6

用二分查找法可有两种实现方法:

1.循环实现

/** 循环实现二分查找算法* * @param arr 有序数组* * @param x 要查找的数* * @return -1 无法查到数据*/
public static int binSearch(int[] arr, int x) {int low = 0;int high = arr.length - 1;while (low <= high) {int middle = (low + high) / 2;if (x == arr[middle]) {return middle;} else if (x < arr[middle]) {high = middle - 1;} else {low = middle + 1;}}return -1;
}

2.递归实现

/*** 递归实现二分查找* * @param arr*            有序数组* @param data*            要查找的数* @param beginIndex*            开始查找的位置* @param endIndex*            结束查找的位置* @return*/
public static int binarySearch(int[] arr, int data, int beginIndex, int endIndex) {int midIndex = (beginIndex + endIndex) / 2;if (data < arr[beginIndex] || data > arr[endIndex] || beginIndex > endIndex) {return -1;}if (data < arr[midIndex]) {return binarySearch(arr, data, beginIndex, midIndex - 1);} else if (data > arr[midIndex]) {return binarySearch(arr, data, midIndex + 1, endIndex);} else {return midIndex;}
}

调用:

int[] arr = { 6, 12, 33, 87, 90, 97, 108, 561 };
System.out.println("循环查找108所在位置:" + binSearch(arr, 108));
System.out.println("循环查找108所在位置:" + binSearch(arr, 108, 0, arr.length - 1));

Java实现二分查找法相关推荐

  1. java,二分查找法,网上查阅

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

  2. java 二分查找_计算机入门必备算法——二分查找法

    1.引言 笔者对于计算机的研究一直停滞不前,近期想对一些算法进行复习和进一步的研究,每天都会更新一个新的算法,算法有难有易,层层递进.不希望能学的有多么高深,只希望在一些最基本的算法上有编码的思路,或 ...

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

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

  4. 学习练习 java 二分查找法

    1 package com.hanqi; 2 3 import java.util.*; 4 5 public class Test5 { 6 7 public static void main(St ...

  5. java算法2_二分查找法

    比如现在有个记录名单的字典,里面的名字是按A-Z的顺序排好的,现在我想找Lily这个人.我可以从第一页开始一页一页的翻,但显然这样效率太低了.我可以怎么做呢?首先我直接翻到字典的中间位置,假如发现这里 ...

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

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

  7. java小练习题---冒泡排序+二分查找法

    题目: 冒泡排序+二分查找法 代码: package scan; import java.util.Scanner; //import java.util.Scanner; public class ...

  8. (java)leetcode852 山脉数组的封顶索引(二分查找法找出数组中最大值的下标)(Peak Index in a Mountain Array)

    题目描述: 我们把符合下列属性的数组 A 称作山脉: A.length >= 3 存在 0 < i < A.length - 1 使得A[0] < A[1] < ... ...

  9. java for循环和数组--冒泡排序、二分查找法

    //100以内与7相关的数 for(int a=1;a<=100;a++){     if(a%7==0||a%10==7||a/10==7){      System.out.print(a+ ...

最新文章

  1. 超级简单的jquery轮播图demo
  2. js中直接对字符串转义-用于solr ulr 关键词转义
  3. SAP Spartacus的用户登录页面设计
  4. 面试还搞不懂Redis,快看看这40道面试题!| 博文精选
  5. git(7)---Git cherry-pick
  6. 聚合函数、分组、子查询及组合查询
  7. 硬着头皮,爬上龙门吊
  8. 16QAM的理论误码率仿真
  9. iOS人脸识别Demo
  10. DDS每个数据包和域ID大小的数据开销
  11. 导航路径规划之四 路径规划概述
  12. mysql rds备份_云数据库RDS如何进行数据备份
  13. asp.net实现识别客户端浏览器或操作系统
  14. 校验组织机构代码 合法性
  15. 搭建高可用的nacos集群
  16. java 反编译器源码分析
  17. 氨基/请加/羧基/生物素功能化水溶性CdSeQds,CdTeQds,CdSe/ZnSQds,ZnOQds,CuInS/ZnSQds量子点
  18. 【Git】fatal: unable to access ‘http://gitlab.example.com/root/test_gitlab.git/‘: Could not resolve ho
  19. digital_logic@一位全加器的真值表@画卡诺图@输出逻辑函数表达式
  20. VScode 使用background插件 报错:Code 安装似乎损坏。请重新安装 解决方法

热门文章

  1. MIT课程全面解读2019深度学习最前沿 | 附视频+PPT
  2. 特斯拉被踢出致命车祸调查组:提前披露信息,涉嫌把责任推向车主
  3. 波士顿动力新机器人登场!
  4. dubbo-monitor-simple-2.5.3-assembly 简易监控中心安装
  5. 部署Docker前必须问自己的四个问题
  6. PostgreSQL 内存OOM控制策略导致数据库无法启动的诊断一例(如何有效避免oom)
  7. 2950交换机简明配置维护手册
  8. “我来管管看”系列:质检部门与生产部门信息不对称怎么办?
  9. 网站导航(站点地图)
  10. Jquery的基础学习