Java语言实现二分查找(可查询重复数据)
文章目录
- 二分查找
- 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语言实现二分查找(可查询重复数据)相关推荐
- binarysearch java,java数据结构之二分查找法 binarySearch的实例
java数据结构之二分查找法 binarySearch的实例 折半查找法,前提是已经排好序的数组才可查找 实例代码: public class BinarySearch { int[] bArr; p ...
- 二分查找及有重复值的查找
二分查找 1.二分查找 二分法查找,也称为折半法,是一种在有序数组中查找特定元素的搜索算法.他的时间复杂度为O(logN) 2.在一组没有重复值的升序数组中查找所求数 //代码及其运行截图 int B ...
- java list 重复数据_java 查找list中重复数据实例详解
java 查找list中重复数据实例详解 需求: 查找一个List集合中所有重复的数据,重复的数据可能不止一堆,比如:aa, bb, aa, bb, cc , dd, aa这样的数据.如果有重复数据, ...
- 1.11 编程基础之二分查找 08 不重复地输出数 python
http://noi.openjudge.cn/ch0111/08/ """ 1.11 编程基础之二分查找 08 不重复地输出数 http://noi.openjudge ...
- java 找出重复的数据_java 查找list中重复数据实例详解
java 查找list中重复数据实例详解 需求: 查找一个list集合中所有重复的数据,重复的数据可能不止一堆,比如:aa, bb, aa, bb, cc , dd, aa这样的数据.如果有重复数据, ...
- 通过C语言实现二分查找法
Hellow,我是jack,今天给大家分享的是C语言实现二分查找.话不多说,让我们直接进入正题. 首先让我们了解下什么是二分查找法 基本思想是将n个元素分成大致相等的两部分,取a [n/2]与x做比较 ...
- 查找出现次数 oracle,oracle查询重复数据出现次数
话不多数上代码: 我在Oracle数据库查数据,发现重复数据,于是我想把重复条数以及具体数据查出来: 下面是数据 然后我需要知道重复多少条 (重复十条,也就是有五条数据相同) SQL: select ...
- 查找数据库中重复数据T-SQL
查找数据库中重复数据T-SQL ========第一篇========= 在一张表中某个字段下面有重复记录,有很多方法,但是有一个方法,是比较高效的,如下语句: select data_guid fr ...
- 【转贴】Oracle查询重复数据与删除重复记录方法
Oracle查询重复数据与删除重复记录方法 比如现在有一人员表 (表名:peosons) 若想将姓名.身份证号.住址这三个字段完全相同的记录查询出来 select p1.* from persons ...
最新文章
- UIWebView保存网页中的图片(转载)
- php gif裁剪,PHP实现图片裁剪与缩放的几种方法
- ArcGIS中标注之一上下标、分数等特殊形式标注(转)
- Python脚本导出为exe程序
- 阿里云实时数仓Hologres年度发布,解读数仓新趋势
- Cause: org.apache.ibatis.builder.BuilderException: Error parsing SQL Mapper Configuration.
- 删除mysql临时文件_mysql自动备份数据库与自动删除临时文件
- 爱可生 mysql监控_MySQL 数据传输DTLE 最新版来啦-爱可生
- LeetCode 438. 找到字符串中所有字母异位词(双指针+滑动窗口)
- 没有基础的人可以学python吗-无基础可以学习Python吗?
- 【数据分析学习】016-numpy数据结构
- 提高工作效率的几个网站
- 人工智能:神经网络与深度学习
- 史上最详细清样/校样(Proof)处理流程--Hindawi(二)
- mysql中用于删除数据的是什么意思_数据库删除语句delete有什么用?
- 在快手工作是一种什么样的体验?
- 1066 Root of AVL Tree——PAT甲级 | 参考mooc实现完整代码
- 【阿里云·云原生架构】白皮书 —— 云原生架构原则
- 荣耀畅玩8C生猛来袭夺C位,红米Note5看了只能默默躲角落
- GitHub分支使用详解
热门文章
- pymysql 写入数据
- tensorflow 风格迁移
- python中回文设计_Python中的回文递归
- python词云改颜色_使用Python创建一个与图像颜色匹配的词云
- 10. Leetcode 209. 长度最小的子数组 (数组-同向双指针-滑动窗口)
- python 笔记:csv 读写
- Java实战应用50篇(二)-SSM框架中的设计模式:动态代理
- 基于爬山算法求解TSP问题(JAVA实现)
- delphi memo 查找字符 下行插入_Vim高手,从来不用鼠标2——替换、撤销、缩进、查找
- LeetCode题组:第206题-反转链表