二十一、二分查找算法(递归非递归)
一、二分查找思路分析
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[前缀和 + 二分查找 + ...
- 二分查找算法(递归+非递归)
二分算法步骤描述 前提:有序数组中查找关键词所在的位置 ① 首先确定整个查找区间的中间位置 mid = strat+(end-strat)/2 ② 用待查关键字key值与中间位置的关键字值进行比较: ...
- 二分查找算法的两种实现方式:非递归实现和递归实现
二分查找的条件是对一组有序数组的查找,这一点很容易忘记,在使用二分查找的时候先要对数组进行排序. 先说一下二分查找的思路:一个有序数组,想要查找一个数字key的下标,首先算出中间下标mid,利用mid ...
- 二分查找算法(递归与非递归两种方式)
首先说说二分查找法. 二分查找法是对一组有序的数字中进行查找,传递相应的数据,进行比较查找到与原数据相同的数据,查找到了返回1,失败返回对应的数组下标. 采用非递归方式完成二分查找法.java代码如下 ...
- c语言折半查找递归程序,C语言数据结构中二分查找递归非递归实现并分析
C语言数据结构中二分查找递归非递归实现并分析 前言: 二分查找在有序数列的查找过程中算法复杂度低,并且效率很高.因此较为受我们追捧.其实二分查找算法,是一个很经典的算法.但是呢,又容易写错.因为总是考 ...
- 二分查找算法递归实现
二分查找(Binary Search),又称折半查找,是一种效率较高的查找算法.折半查找需要线性表采用顺序存储结构,即查找的对象必须是一个有序序列.如{1,2,3,4,5...},{10 ,8,6,4 ...
- 递归来实现一个二分查找算法函数bi_search()
题目内容: 定义一个 prime() 函数求整数 n 以内(不包括n)的所有素数(1不是素数),并返回一个按照升序排列的素数列表.使用递归来实现一个二分查找算法函数bi_search(),该函数实现检 ...
- python递归实现二分查找_python二分查找算法的递归实现
本文实例讲述了python二分查找算法的递归实现方法.分享给大家供大家参考,具体如下: 这里先提供一段二分查找的代码: def binarySearch(alist, item): first = 0 ...
最新文章
- java DOS 命令行代码
- python创建一个新的txt文件-如何在python中编辑文本文件并创建一个新的文本文件?...
- vue中如何关闭eslint检测?
- springSecurity源码分析——DelegatingFilterProxy类的作用
- pymysql.err.InternalError: (1054, Unknown column '27D24A3B' in 'where clause')之错误解决
- Go 如何利用 Linux 内核的负载均衡能力
- kali安装步骤失败 选择并安装软件_7Zip v19.00 软件安装步骤
- [转载] [Python图像处理] 二十二.Python图像傅里叶变换原理及实现
- Java中的抽象类与abstract关键字
- UIView属性clipsTobounds的应用
- paip.解决 Gtk-CRITICAL **: IA__gtk_widget_show: assertion `GTK_IS_WIDGET (widget)' failed
- php代码,IP地址归属地批量查询功能
- 5.13 广东移动 笔试题
- 电子电工技术------电阻元件,电感元件与电容元件
- postgres中的中文分词zhparser
- 2022-05-02 Unity核心4——SpriteShape
- 使用python做迷宫
- [转]NLP关键词提取方法总结及实现
- 《鹧鸪天》——厉以宁
- LLDB breakpoint syntax