文章目录

  • 二分查找
    • 1.前言
    • 2.算法思想
    • 3.图示
    • 4.优缺点
    • 5.代码实现
      • 标准二分查找
      • 拓展:可以查询重复值

二分查找

1.前言

二分查找是一种查询效率非常高的查找算法,又称为折半查找。

用递归思想来实现二分查找较为形象并且代码可读性强,因此本文中将介绍二分查找的思想,代码实现以及重复值查找的拓展。


2.算法思想

使用二分查找的前提是在一组有序的序列下进行,每次以序列的中间位置的数作为标准与带查找的数进行比较,从而调整查找方向,并且缩小查找范围,直至匹配成功。

3.图示

4.优缺点

  • 优点:比较次数少,查找速度快,平均性能较好
  • 缺点:要求待查表为有序表,并且插入删除困难

因此二分查找适用于不经常变动且查找频繁的有序列表。


5.代码实现

标准二分查找

/**** @param array     有序数组* @param left      左边的索引* @param right     右边的索引* @param findValue 要查找的值* @return   如果找到返回下标 否则返回-1*/
public static int binarySearch(int[] array,int left,int right,int findValue)
{//更新mid值从而缩小查找范围int mid = (left + right)/2;//作为查找标准 通过比较midValue和findValue来调整查找方向int midValue = array[mid];//递归终止条件//-->当left索引值移动至right右方则说明该序列表已经查找完毕,但仍然未匹配到相等的值if (left > right){return -1;}//查找的值在标准值右方if (findValue > midValue){//调整left值,向右递归return binarySearch(array, mid+1, right, findValue);}//查找的值在标准值左方else if (findValue < midValue){//调整right值,向左递归return binarySearch(array, left, mid-1, findValue);}//匹配成功else{//返回索引值return mid;}
}

测试

/*** 二分查找的前提:数组是有序的* @param args*/
public static void main(String[] args)
{int[] array = {1,8,10,89,1000,1989};int index = binarySearch(array, 0, array.length-1, 1000);System.out.println(index);
}//---------------------------------------------------测试结果------------------------------------------------------
待查找的值为1000,在该序列中的索引值为:4

拓展:可以查询重复值

/*** 思路分析:*    1.在找到查找的值的索引值时不要立刻返回索引*    2.在索引值左边进行遍历,将所有等于当前索引值的元素下表添加到集合ArrayList中*    3.在索引值右边进行遍历,将所有等于当前索引值的元素下表添加到集合ArrayList中*    4.返回ArrayList* @param array     数组* @param left      左边的索引* @param right     右边的索引* @param findValue 要查找的值* @return   如果找到返回下标 否则返回-1*/
public static List<Integer> binarySearchMut(int[] array,int left,int right,int findValue)
{int mid = (left + right)/2;int midValue = array[mid];//存储索引值的列表ArrayList<Integer> arrayList = new ArrayList<>();if (left > right){//如果没有找到值返回-1arrayList.add(-1);return arrayList;}if (findValue > midValue){return binarySearchMut(array, mid+1, right, findValue);}else if (findValue < midValue){return binarySearchMut(array, left, mid-1, findValue);}else{//用于左右遍历查找相同值的辅助遍历指针int temp = mid - 1;//向左遍历while (true){if (temp < 0 || array[temp] != midValue){break;}arrayList.add(temp);temp--;}arrayList.add(mid);temp = mid + 1;//向右遍历while (true){if (temp > array.length - 1 || array[temp] != midValue){break;}arrayList.add(temp);temp++;}return arrayList;}
}

以上。

如有不足或错误欢迎评论指正。

Java语言实现二分查找(可查询重复数据)相关推荐

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

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

  2. 二分查找及有重复值的查找

    二分查找 1.二分查找 二分法查找,也称为折半法,是一种在有序数组中查找特定元素的搜索算法.他的时间复杂度为O(logN) 2.在一组没有重复值的升序数组中查找所求数 //代码及其运行截图 int B ...

  3. java list 重复数据_java 查找list中重复数据实例详解

    java 查找list中重复数据实例详解 需求: 查找一个List集合中所有重复的数据,重复的数据可能不止一堆,比如:aa, bb, aa, bb, cc , dd, aa这样的数据.如果有重复数据, ...

  4. 1.11 编程基础之二分查找 08 不重复地输出数 python

    http://noi.openjudge.cn/ch0111/08/ """ 1.11 编程基础之二分查找 08 不重复地输出数 http://noi.openjudge ...

  5. java 找出重复的数据_java 查找list中重复数据实例详解

    java 查找list中重复数据实例详解 需求: 查找一个list集合中所有重复的数据,重复的数据可能不止一堆,比如:aa, bb, aa, bb, cc , dd, aa这样的数据.如果有重复数据, ...

  6. 通过C语言实现二分查找法

    Hellow,我是jack,今天给大家分享的是C语言实现二分查找.话不多说,让我们直接进入正题. 首先让我们了解下什么是二分查找法 基本思想是将n个元素分成大致相等的两部分,取a [n/2]与x做比较 ...

  7. 查找出现次数 oracle,oracle查询重复数据出现次数

    话不多数上代码: 我在Oracle数据库查数据,发现重复数据,于是我想把重复条数以及具体数据查出来: 下面是数据 然后我需要知道重复多少条 (重复十条,也就是有五条数据相同) SQL: select ...

  8. 查找数据库中重复数据T-SQL

    查找数据库中重复数据T-SQL ========第一篇========= 在一张表中某个字段下面有重复记录,有很多方法,但是有一个方法,是比较高效的,如下语句: select data_guid fr ...

  9. 【转贴】Oracle查询重复数据与删除重复记录方法

    Oracle查询重复数据与删除重复记录方法 比如现在有一人员表 (表名:peosons) 若想将姓名.身份证号.住址这三个字段完全相同的记录查询出来 select p1.* from persons ...

最新文章

  1. UIWebView保存网页中的图片(转载)
  2. php gif裁剪,PHP实现图片裁剪与缩放的几种方法
  3. ArcGIS中标注之一上下标、分数等特殊形式标注(转)
  4. Python脚本导出为exe程序
  5. 阿里云实时数仓Hologres年度发布,解读数仓新趋势
  6. Cause: org.apache.ibatis.builder.BuilderException: Error parsing SQL Mapper Configuration.
  7. 删除mysql临时文件_mysql自动备份数据库与自动删除临时文件
  8. 爱可生 mysql监控_MySQL 数据传输DTLE 最新版来啦-爱可生
  9. LeetCode 438. 找到字符串中所有字母异位词(双指针+滑动窗口)
  10. 没有基础的人可以学python吗-无基础可以学习Python吗?
  11. 【数据分析学习】016-numpy数据结构
  12. 提高工作效率的几个网站
  13. 人工智能:神经网络与深度学习
  14. 史上最详细清样/校样(Proof)处理流程--Hindawi(二)
  15. mysql中用于删除数据的是什么意思_数据库删除语句delete有什么用?
  16. 在快手工作是一种什么样的体验?
  17. 1066 Root of AVL Tree——PAT甲级 | 参考mooc实现完整代码
  18. 【阿里云·云原生架构】白皮书 —— 云原生架构原则
  19. 荣耀畅玩8C生猛来袭夺C位,红米Note5看了只能默默躲角落
  20. GitHub分支使用详解

热门文章

  1. pymysql 写入数据
  2. tensorflow 风格迁移
  3. python中回文设计_Python中的回文递归
  4. python词云改颜色_使用Python创建一个与图像颜色匹配的词云
  5. 10. Leetcode 209. 长度最小的子数组 (数组-同向双指针-滑动窗口)
  6. python 笔记:csv 读写
  7. Java实战应用50篇(二)-SSM框架中的设计模式:动态代理
  8. 基于爬山算法求解TSP问题(JAVA实现)
  9. delphi memo 查找字符 下行插入_Vim高手,从来不用鼠标2——替换、撤销、缩进、查找
  10. LeetCode题组:第206题-反转链表