二分查找

前提条件

我们的二分查找必须是在有序数组中查找

无论是从小到大还是从大到小

题目

请对一个有序数组进行二分查找{1, 8,10,89,1000,1234},输入一个数
看看该数组是否在此数,姐出下标,如果没有就提示没有这个数”。

思路

我们这次的二分查找会用到递归的思想,当然也有非递归的方式,我是分开来学习了

1.首先确定数组的中间下标mid mid = (left+ right)/2

2.让需要查找的数findValue和我们的arr[mid]比较

​ 如果findValue>arr[mid],往右边递归

​ 如果findValue<arr[mid],向左边递归查找

​ 如果正好找到就返回

那我们的递归出口(结束条件)是什么

1.找到了,直接返回退出了

2.递归万整个数组,没有找到findValue,也需要结束递归时,当我们的left>right就代表要结束了

代码

//二分查找
//@author 王
public class BinarySearch {public static void main(String[] args) {// TODO Auto-generated method stubint arr[] = {1,8,10,89,1000,1234};//必须是有序数组int resultIndex = binarySearch(arr, 0, arr.length -1, 1234);System.out.println(resultIndex);}/*** * @param arr           数组* @param left            左边索引* @param right         右边索引* @param findValue     需要找的数字,找到返回下标,未找到返回-1* @return*///二分查找算法public static int binarySearch(int[] arr,int left,int right,int findValue) {int mid = (left+right)/2;int midValue = arr[mid];if(findValue >midValue){//向右递归return binarySearch(arr, mid+1, right, findValue);}else if(findValue < midValue){//向左递归return binarySearch(arr, left, mid-1, findValue);}else{return mid;}}}

我们很容易发现这其中的问题,我们的递归存在问题,如果我们找一个不存在的数救会报错,这个错误是死递归造成的错误

Exception in thread "main" java.lang.StackOverflowErrorat 查找算法.BinarySearch.binarySearch(BinarySearch.java:27)

那我们就得来写出这个递归的结束出口

改进

//二分查找
//@author 王
public class BinarySearch {public static void main(String[] args) {// TODO Auto-generated method stubint arr[] = {1,8,10,89,1000,1234};//必须是有序数组int resultIndex = binarySearch(arr, 0, arr.length -1, 123);if(resultIndex != -1){System.out.println(resultIndex);}else{System.out.println("没有找到这个数字");}}/*** * @param arr         数组* @param left            左边索引* @param right         右边索引* @param findValue     需要找的数字,找到返回下标,未找到返回-1* @return*///二分查找算法public static int binarySearch(int[] arr,int left,int right,int findValue) {if(left > right){return -1;}int mid = (left+right)/2;int midValue = arr[mid];if(findValue >midValue){//向右递归return binarySearch(arr, mid+1, right, findValue);}else if(findValue < midValue){//向左递归return binarySearch(arr, left, mid-1, findValue);}else{return mid;}}}

我们再来扩充一点,也是老师的课后习题
{1,8,10,89,1000,1000,1000,1234} 当一个有序数组中,有多个相同的数值时,如何将所有的数值都查找到,比如这里的1000.

思路跟我上一个学的差不多,我们可以采用一个集合来存储我们的索引值,返回我们的集合

代码

public class BinarySearch {public static void main(String[] args) {// TODO Auto-generated method stubint arr[] = {1,8,10,89,1000,1000,1000,1234};//必须是有序数组ArrayList<Integer> resultIndex = binarySearch2(arr, 0, arr.length -1, 1000);if(resultIndex.size() == 0){System.out.println("没有找到这个数字");}else{System.out.println(resultIndex);}}public static ArrayList<Integer> binarySearch2(int[] arr,int left,int right,int findValue) {if(left > right){return new ArrayList<Integer>();}int mid = (left+right)/2;int midValue = arr[mid];if(findValue >midValue){//向右递归return binarySearch2(arr, mid+1, right, findValue);}else if(findValue < midValue){//向左递归return binarySearch2(arr, left, mid-1, findValue);}else{ArrayList<Integer> list = new ArrayList<Integer>();int temp = mid -1;//向左边扫描while(true){if(temp < 0 || arr[temp] != findValue){//退出break;}else{//否则就将temp放到集合中list.add(temp);temp -= 1;//temp左移}}list.add(mid);//向右扫描temp = mid +1;while(true){if(temp > arr.length - 1 || arr[temp] != findValue){//退出break;}else{//否则就将temp放到集合中list.add(temp);temp += 1;//temp左移}}return list;}}
}

查找算法---二分查找(递归方式)相关推荐

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

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

  2. 数据结构三大查找算法(二分查找、插值查找、斐波那契数列查找)C语言实现

    文章目录 查找 二分查找(折半查找) 插值查找 斐波拉契查找 总结: 查找 查找是在大量的信息里面寻找一个特定的信息元素 (1)静态查找和动态查找: 静态或者动态都是针对查找表而言的.动态表指查找表中 ...

  3. php折半查找算法,二分查找 [折半查找] 算法 PHP 版

    查找表:就是同一类型的数据元素构成的数据集合 有静态表和动态表 本文实现PHP版的二分查找算法[本算法仅用于顺序存储的查找表] /** * Created by PhpStorm. * User: 1 ...

  4. 查找算法——二分查找(原理+源码)

    1,原理 二分查找又称折半查找,只适用于有序数组.二分查找原理很简单,针对有序数组的查找效率也很高.具体原理为,每次拿目标数值(以下用value表示)与数组中间位置的数据(以下用arry[mid]表示 ...

  5. 查找算法——二分查找【代码实现】

    伪代码 递归 // initially called with low = 0, high = N-1BinarySearch(A[0..N-1], value, low, high) {// inv ...

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

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

  7. 查找算法-(顺序查找、二分查找、插值查找、斐波那契查找)

    1)顺序查找或叫线性查找 就是顺序遍历匹配 2)二分查找 package search;public class BinarySearch {/*** 二分查找数组必须有序*//**** @param ...

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

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

  9. 顺序查找与二分查找算法

    顺序查找算法 顺序查找是非常简单常用的查找算法,基本思路:从第一个元素m开始逐个与需要查找的元素x进行比较,当比较到元素值相同(即m=x)时返回元素m的下标,如果比较到最后都没有找到,则返回-1.该算 ...

  10. 【Java数据结构与算法】第九章 顺序查找、二分查找、插值查找和斐波那契查找

    第九章 顺序查找.二分查找.插值查找和斐波那契查找 文章目录 第九章 顺序查找.二分查找.插值查找和斐波那契查找 一.顺序查找 1.基本介绍 2.代码实现 二.二分查找 1.基本介绍 2.代码实现 三 ...

最新文章

  1. ERP实施流程---计划部
  2. 理性预期学派(Rational Expectation School)
  3. GIT项目管理工具(part2)--初始配置
  4. 64位程序怎么判断指针是否有效_AArch64应用程序级编程模型
  5. MFC 教程【1_MFC概述 】
  6. wordpress中文主题problog1.0发布,主打简洁,商务
  7. 3 sum python
  8. Ubuntu MPEG-4 AAC 与 H.264 解码器安装
  9. R中报错ERROR: configuration failed for package ‘magick’
  10. 用ssms建sql server数据库和python连接到数据库
  11. ospf的链路更新—不同种类的LSA
  12. P3975 [TJOI2015]弦论 (SAM)
  13. 网络安全之路:我的系统性渗透测试学习框架
  14. jq查找div下的第二个span
  15. 软量子计算机机 铷,陈根:迄今最多量子比特的机器,让量子计算进入全新领域...
  16. 什么是OPen Flow?
  17. 电商企业的商业模式比较
  18. 5. 试用期个人工作总结(篇五)
  19. SpringCloud-Netflix-Eureka
  20. easyui combobox 拼音检索快捷选择输入

热门文章

  1. 个人h5第三方支付接口_个人免签支付接口系统搭建源码多种方式
  2. 遨博机器人展示_高交会:智能机器人走入大众生活
  3. SpringBoot:java.lang.NullPointerException
  4. Maven打jar发布包的常用配置
  5. dedecms读取多个类别信息
  6. 点云质量评估_Chamfer Distance--倒角距离
  7. 算法笔记_面试题_8.零钱兑换
  8. 上海中环C位出道,自动驾驶天团横「扫」北上广
  9. 京西古道,王平到圈门的穿越
  10. js每隔5分钟执行一次ajax请求的实现方法