二分查找算法思想

二分查找针对的是一个有序的数据集合也就是数组(这也成为了二分查找的一个重要局限性),查找思想有点类似分治思想。
每次都通过跟区间的中间元素对比,将待查找的区间缩小为之前的一半,直到找到要查找的元素,或者区间被缩小为0

(一:返回查找数对应的下标

java代码实现第一种递归版:

public class BinarySearch {public static void main(String[] args) {
int arr[]={1,2,3,4,5,6,7,8,9,10};
int index=BinarySearch(arr,0,arr.length,2);System.out.println("查找的位置"+rIndex);
}/**
int arr[]:已经排好序的数组
int left:左下标
int right :右下标
int findVal :要找的值
*/
public static int BinarySearch(int arr[],int left,int right,int findVal){
//找到中间位置
int mid=(left+right)/2;
//找到中间下标在数组中对应的值
int midVal=arr[mid];
//进行判断,如果左边下标大于右边下标,表示已经遍历完数组,没有找到该元素,返回-1;
if(left>right){
return -1;
}
//如果要找的元素findVal大于中间值midVal,则在数组的右边,向右进行递归,
if(midVal<findVal){
return  BinarySearch(arr,mid+1,right,findVal);
}else if(midVal>findVal){
//如果要找的元素findVal小于中间值midVal,则在数组的左边,向左进行递归;
return  BinarySearch(arr,left,mid-1,findVal);
}else{
//说明找到了该元素,返回该元素对应的下标mid;
return mid;
}}
}

java代码实现第二种非递归版:

public class BinarySearch {public static void main(String[] args) {
int arr[]={1,2,3,4,5,6,7,8,9,10};
int index=BinarySearch(arr,0,arr.length,2);System.out.println("查找的位置"+rIndex);
}public static int BinarySearch(int arr[],int left,int right,int findVal){
int mid=(left+right)/2;
int midVal=arr[mid];
//先进行判断,如果要找的元素findVal小于数组的最小值或者大于数组的最大值,则不能找到findVal,返
//回-1
//如果左边下标大于右边下标也不能找到该元素findVal,返回-1
if(findVal<arr[left]||findVal>arr[right]||left>right){
return -1;
}
//左下标<右下标,说明数组还没有遍历完
while(left<right){
//因为左右下标会变,需要更新mid值
mid=(left+right)/2;
//如果,要找的值findVal 大于arr[mid],在数组的右边,左下标定义为left=mid+1
if(findVal>arr[mid]){
left=mid+1;
}else if(findVal<arr[mid]){
//如果要找的元素findVal小于arr[mid],说明在数组的左边,右下边冲洗定义为right=mid-1
right=mid-1;
}else{
return mid;
}
//遍历完数组没有找到挂元素findVal,返回-1;
return -1;
}
}

(二:返回一个集合,为全部该数值的下标)

public class BinarySearch {public static void main(String[] args) {
int []arr={1,2,2,2,2,6,7,8,9,10};
List<Integer> resIndexList= BinarySearch2(arr,0,arr.length,2);System.out.println("查找的位置"+resIndexList);
}
/**
int arr[]:排好序的数组
int left:左边下标
int right:右边索引
int findVal:要找的元素
return:返回一个集合,为全部该数值的下标
*/
public static List<Integer> BinarySearch(int arr[],int left,int right,int findVal){
//中间下标
int mid=(left+right)/2;
int midVal=arr[mid];
//如果左索引大于右索引,返回一个空链表
if(left>right){
return new ArrayList<Integer>();
}
//如果要找的元素findVal大于中间值midVal,则在数组的右边,向右进行递归
if(midVal<findVal){
return  BinarySearch(arr,mid+1,right,findVal);
}else if(midVal>findVal){
//如果要找的元素findVal小于中间值midVal,则在数组的左边,向左进行递归
return BinarySearch(arr,left,mid-1,findVal);
}else{
//创建一个链表
List<Integer> list=new ArrayList();
//定义一个在中间下表前前一个下标temp
int temp=mid-1;
while(true){
//判断,如果下标小于0或者不等于要找的元素findVal,则退出循环,
if(temp<0||arr[temp]!=findVal){
break;
}
//说明下标temp对应数组的值都等于findVal,加入链表
list.add(temp);
temp--;
}
//注意 :这里不要忘记加入mid
list。add(mid);
//重新定义temp为mid后一个下标
temp=mid+1;
while(true){
if(temp>right||arr[temp]!=findVal){
break;
}
list.add(temp);
temp++;
}
}
//返回链表
return list;
}
}

java查找算法:二分查找(两种方式)相关推荐

  1. Java中HashMap遍历的两种方式

    第一种: Map map = new HashMap(); Iterator iter = map.entrySet().iterator(); while (iter.hasNext()) { Ma ...

  2. java读取csv文件的两种方式

    java读取csv文件的两种方式 1.CsvReader读取 import com.csvreader.CsvReader; /*** CsvReader 读取* @param filePath* @ ...

  3. Java判断回文数(两种方式)

    Java判断回文数(两种方式) 回文数是一个非常特殊的数,它从左边读和从右边读是一样的.例如12321 判断方式有两种. 方式一:对该数字进行分解,然后一一比对,拆解成 1 2 3 2 1,然后第一位 ...

  4. 数据结构与算法-查找算法(二分查找,插值查找,斐波那契(黄金分割法)查找)

    查找算法 以下三种算法的基本思想相同,都是利用递归来寻找 二分查找 思路分析 1.首先确定该数组的中间下标,min = (left + right) / 2 2.然后让需要查找的的数findVal和a ...

  5. Java中实现多线程的两种方式之间的区别

    Java提供了线程类Thread来创建多线程的程序.其实,创建线程与创建普通的类的对象的操作是一样的,而线程就是Thread类或其子类的实例对象.每个Thread对象描述了一个单独的线程.要产生一个线 ...

  6. java中实现同步的两种方式:syschronized和lock的区别和联系

    转载自 http://www.cnblogs.com/xiohao/p/4151408.html Lock是java.util.concurrent.locks包下的接口,Lock 实现提供了比使用s ...

  7. java jobdetail_Spring创建JobDetail的两种方式

    一.Spring创建JobDetail的两种方式 定时任务两种方式,Spring很好的封装使用Quartz的细节,第一种方式是利用SPring封装的Quartz类进行特定方法的实现,第二种是通过透明的 ...

  8. Java中Http连接的两种方式

    在java中连接http,介绍两种方法,一种是java的HttpUrlConnection,另一种是apacha公司的httpClient,后者是第三方的类库需要从外部,导入,同时这也是第一次使用外部 ...

  9. 算法导论Java实现-随机化数组的两种方式(5.3章节)

    package lhz.algorithm.chapter.five; /** * 随机数组两种实现,<算法导论>第五章第三节 * 本文地址:http://mushiqianmeng.bl ...

  10. 折半查找算法[二分查找法]算法的实现和解决整数溢出问题~

    算法实现的要求: 折半查找法又称为二分查找法,这种方法对待查找的列表有两个要求: 1:必须采用顺序存储结构 2:必须按关键字大小有序排列 算法思想: 将表中间位置记录的关键字与查找关键字进行比较,如果 ...

最新文章

  1. 2019人工智能的“领头羊”会是?
  2. JAVA之JVM GC 机制与性能优化
  3. IntelliJ IDEA 中的 project 和 module 与Eclipse中workspace和project的关系
  4. 实战并发编程 - 08基于Guarded Suspension模式优化轮询while(true)
  5. MongoDB 4.2 正式发布,支持分布式事务!
  6. u boot 驱动完成
  7. (计算机组成原理)第二章数据的表示和运算-第二节5:定点数乘法运算(原码/补码一位乘法)
  8. (转)分布式文件存储FastDFS(二)FastDFS安装
  9. 成立20周年之际 阿里巴巴将发布“新六脉神剑”
  10. 清除子节点、创建子节点函数
  11. php生成缩略图实例,(实用篇)PHP生成缩略图的方法实例
  12. vm虚拟机开启蓝屏问题
  13. RobotFramework-关键字-Wait Until Keyword Succeeds
  14. 国外虚拟主机购买时的注意事项
  15. [ISUX译]iOS 9人机界面指南(一):UI设计基础
  16. 滑铁卢大学开发了一套AI工具,教泥瓦匠初学者搬砖诀窍
  17. 一位 19 年 Mac 用户的心声:“我真的很讨厌库克”
  18. 自然数的皮亚诺公理系統
  19. android打开wav格式,在Android中使用AudioTrack播放WAV文件
  20. 无盘服务器 主板,服务器主板 无盘专用

热门文章

  1. 《高等数学》练习题库含答案(大学期末复习资料)
  2. python北风网培训班视频
  3. 如何批量查询ip地址归属地等信息?
  4. jdk1.8_API中文帮助文档
  5. OpenCore启动项中无Install macOS Big Sur 的解决办法
  6. 锐捷Linux认证失败,如何解决win10系统锐捷认证失败?锐捷认证失败的解决方法步骤...
  7. sqlite dev破解
  8. 计算机维修英语情景对话大全,实用英语短对话:修电脑
  9. MySQL基础知识系统学习
  10. Python分析王者峡谷中英雄信息