一、二分查找思路分析

1.首先确定该数组中间的下标 ,即mid=(left+high)/2;

2.然后让需要查找的value值与array[mid]值进行比较

2.1)findVal > arr[mid] ,说明你要查找值在mid的右边,因此需要向右递归进行查找。

2.1)findVal < arr[mid] ,说明你要查找值在mid的左边,因此需要向左递归进行查找。

2.3)findVal == arr[mid]说明找到,就返回

二、二分查找递归的退出条件

1.找到就结束递归

2.递归完整个数组,仍然没有找到findVal,也需要结束递归,即left > right 就要退出

三、递归代码实现

package cn.zzw.algorithm.search;import java.util.ArrayList;
import java.util.List;public class BinarySearch {public static void main(String[] args) {int arr[]={1,8,96,54,65,65,65,35,52,77};//int index=binarySearch(arr,0,arr.length-1,8);//System.out.println("下标为:"+index);List<Integer> list=binarySearch2(arr,0,arr.length-1,65);System.out.println("下标集合为:"+list);}/**** @param arr 所要查找值的数组* @param left 数组最左下标* @param right 数组的最右下标* @param findVal 要查找的值* @return*/public static int binarySearch(int[] arr,int left,int right,int findVal){//如果left>right,说明递归查找整个数组之后没有找到相应的数值if(left>right){return -1;}int mid=(left+right)/2;if(findVal>arr[mid]){return binarySearch(arr,mid+1,right,findVal);}else if (findVal<arr[mid]){return binarySearch(arr,left,mid-1,findVal);}else{return mid;}}/*** 在一个数组中含有相同的数值,则如何将所有的下标都找到** 思路分析:* 1.在找到mid时,不要直接返回* 2.向mid索引值的左边扫描,将所有满足的值的下标,加入到集合ArrayList* 3.向mid索引值的又边扫描,将所有满足的值的下标,加入到集合ArrayList* 4.将ArrayLis返回*/public static ArrayList<Integer> binarySearch2(int[] arr,int left,int right,int findVal){if(left>right){return new ArrayList<Integer>();}int mid=(left+right)/2;if(findVal>arr[mid]){return binarySearch2(arr,mid+1,right,findVal);}else if (findVal<arr[mid]){return binarySearch2(arr,left,mid-1,findVal);}else{ArrayList<Integer> arrayList = new ArrayList<>();//向mid索引值的左边扫描,将所有满足的值的下标,加入到ArrayListint temp=mid-1;while (true){if(temp<0 || arr[temp]!=findVal){break;}//否则将temp放入到list集合中arrayList.add(temp);temp--;}arrayList.add(mid);//向mid索引值的右边扫描,将所有满足的值的下标,加入到ArrayList中temp=mid+1;while (true){if(temp>arr.length-1||arr[temp]!=findVal){break;}//否则,将temp放入到ArrayListarrayList.add(temp);temp++;}return arrayList;}}
}

非递归代码实现

package cn.zzw.algorithm.binarySearchNoRecursion;public class binarySearchNoRecursion {public static void main(String[] args) {int[] arr = {1,3, 8, 10, 11, 67, 100};int index=binarySearchNoRecur(arr,10);System.out.println("index="+index);}//编写一个非递归的二分查找public static int binarySearchNoRecur(int arr[],int target){int left=0;int right=arr.length-1;while (left<=right){int mid=(left+right)/2;if (arr[mid]==target){return mid;}else if (arr[mid]<target){left=mid+1;}else{right=mid-1;}}return -1;}}

二十一、二分查找算法(递归非递归)相关推荐

  1. 二分查找算法(非递归)

    1.二分查找算法(非递归)介绍 前面我们讲过了二分查找算法,是使用递归的方式,下面我们讲解二分查找算法的非递归方式 二分查找法只适用于从有序的数列中进行查找(比如数字和字母等),将数列排序后再进行查找 ...

  2. 二分查找算法详细汇总

    二分查找算法详细汇总 文章目录 二分查找算法详细汇总 二分查找算法介绍模板 算法思想 举例说明 模板实现 (1)递归方式实现 (2)非递归方式实现 二分查找问题相关难点问题1[前缀和 + 二分查找 + ...

  3. 二分查找算法(递归+非递归)

    二分算法步骤描述 前提:有序数组中查找关键词所在的位置 ① 首先确定整个查找区间的中间位置 mid = strat+(end-strat)/2 ② 用待查关键字key值与中间位置的关键字值进行比较: ...

  4. 二分查找算法的两种实现方式:非递归实现和递归实现

    二分查找的条件是对一组有序数组的查找,这一点很容易忘记,在使用二分查找的时候先要对数组进行排序. 先说一下二分查找的思路:一个有序数组,想要查找一个数字key的下标,首先算出中间下标mid,利用mid ...

  5. 二分查找算法(递归与非递归两种方式)

    首先说说二分查找法. 二分查找法是对一组有序的数字中进行查找,传递相应的数据,进行比较查找到与原数据相同的数据,查找到了返回1,失败返回对应的数组下标. 采用非递归方式完成二分查找法.java代码如下 ...

  6. c语言折半查找递归程序,C语言数据结构中二分查找递归非递归实现并分析

    C语言数据结构中二分查找递归非递归实现并分析 前言: 二分查找在有序数列的查找过程中算法复杂度低,并且效率很高.因此较为受我们追捧.其实二分查找算法,是一个很经典的算法.但是呢,又容易写错.因为总是考 ...

  7. 二分查找算法递归实现

    二分查找(Binary Search),又称折半查找,是一种效率较高的查找算法.折半查找需要线性表采用顺序存储结构,即查找的对象必须是一个有序序列.如{1,2,3,4,5...},{10 ,8,6,4 ...

  8. 递归来实现一个二分查找算法函数bi_search()

    题目内容: 定义一个 prime() 函数求整数 n 以内(不包括n)的所有素数(1不是素数),并返回一个按照升序排列的素数列表.使用递归来实现一个二分查找算法函数bi_search(),该函数实现检 ...

  9. python递归实现二分查找_python二分查找算法的递归实现

    本文实例讲述了python二分查找算法的递归实现方法.分享给大家供大家参考,具体如下: 这里先提供一段二分查找的代码: def binarySearch(alist, item): first = 0 ...

最新文章

  1. java DOS 命令行代码
  2. python创建一个新的txt文件-如何在python中编辑文本文件并创建一个新的文本文件?...
  3. vue中如何关闭eslint检测?
  4. springSecurity源码分析——DelegatingFilterProxy类的作用
  5. pymysql.err.InternalError: (1054, Unknown column '27D24A3B' in 'where clause')之错误解决
  6. Go 如何利用 Linux 内核的负载均衡能力
  7. kali安装步骤失败 选择并安装软件_7Zip v19.00 软件安装步骤
  8. [转载] [Python图像处理] 二十二.Python图像傅里叶变换原理及实现
  9. Java中的抽象类与abstract关键字
  10. UIView属性clipsTobounds的应用
  11. paip.解决 Gtk-CRITICAL **: IA__gtk_widget_show: assertion `GTK_IS_WIDGET (widget)' failed
  12. php代码,IP地址归属地批量查询功能
  13. 5.13 广东移动 笔试题
  14. 电子电工技术------电阻元件,电感元件与电容元件
  15. postgres中的中文分词zhparser
  16. 2022-05-02 Unity核心4——SpriteShape
  17. 使用python做迷宫
  18. [转]NLP关键词提取方法总结及实现
  19. 《鹧鸪天》——厉以宁
  20. LLDB breakpoint syntax

热门文章

  1. onbeforedunload事件
  2. LeetCode 1024. 视频拼接
  3. Python 在 命令行中 安装 matplotlib
  4. RDKit | 基于RDKit和化学信息学探索化学空间
  5. Git 删除已经提交的文件(Delete commits from a branch in Git)
  6. php heredoc 开启,PHP中nowdoc和heredoc使用需要注意的一点
  7. 科研杂谈 | 全球最大的数字图书馆
  8. UpSetR 高级参数使用教程
  9. 潜心学术,我删除了无数公众号,却将这10个置顶
  10. 收藏|56张图片带您认识细菌长啥样?