package com.search;import java.util.ArrayList;
import java.util.List;/*** @Auther: 大哥的叔* @Date: 2019/8/9 17:21* @Description:*/
//注意:使用二分查找的前提是 该数组是有序的
public class BinarySearch {public static void main (String[] args) {int arr[] = { 1, 8, 10, 89,1000,1000, 1234 };int resIndex = binarySearch(arr,0,arr.length-1,89);System.out.println(resIndex);List<Integer> resIndexList = binarySearch2(arr, 0, arr.length - 1, 1000);System.out.println("resIndexList=" + resIndexList);}// 二分查找算法/**** @param arr*            数组* @param left*            左边的索引* @param right*            右边的索引* @param findVal*            要查找的值* @return 如果找到就返回下标,如果没有找到,就返回 -1*/public static int binarySearch(int[] arr,int left,int right,int findVal){if (left > right) {return -1;}int mid = (left+right)/2;int midVal = arr[mid];if (findVal>midVal){return binarySearch(arr,mid+1,right,findVal);}else if (findVal<midVal){return binarySearch(arr,left,mid -1,findVal);}else {return mid;}}/** 课后思考题: {1,8, 10, 89, 1000, 1000,1234} 当一个有序数组中,* 有多个相同的数值时,如何将所有的数值都查找到,比如这里的 1000** 思路分析* 1. 在找到mid 索引值,不要马上返回* 2. 向mid 索引值的左边扫描,将所有满足 1000, 的元素的下标,加入到集合ArrayList* 3. 向mid 索引值的右边扫描,将所有满足 1000, 的元素的下标,加入到集合ArrayList* 4. 将Arraylist返回*/public static List<Integer> binarySearch2(int[] arr, int left, int right, int findVal){System.out.println("hello~");// 当 left > right 时,说明递归整个数组,但是没有找到if (left > right) {return new ArrayList<Integer>();}int mid = (left + right) / 2;int midVal = arr[mid];if (findVal > midVal) { // 向 右递归return binarySearch2(arr, mid + 1, right, findVal);} else if (findVal < midVal) { // 向左递归return binarySearch2(arr, left, mid - 1, findVal);} else {
//           * 思路分析
//           * 1. 在找到mid 索引值,不要马上返回
//           * 2. 向mid 索引值的左边扫描,将所有满足 1000, 的元素的下标,加入到集合ArrayList
//           * 3. 向mid 索引值的右边扫描,将所有满足 1000, 的元素的下标,加入到集合ArrayList
//           * 4. 将Arraylist返回List<Integer> resIndexlist = new ArrayList<Integer>();//向mid 索引值的左边扫描,将所有满足 1000, 的元素的下标,加入到集合ArrayListint temp = mid - 1;while(true) {if (temp < 0 || arr[temp] != findVal) {//退出break;}//否则,就temp 放入到 resIndexlistresIndexlist.add(temp);temp -= 1; //temp左移}resIndexlist.add(mid);  ////向mid 索引值的右边扫描,将所有满足 1000, 的元素的下标,加入到集合ArrayListtemp = mid + 1;while(true) {if (temp > arr.length - 1 || arr[temp] != findVal) {//退出break;}//否则,就temp 放入到 resIndexlistresIndexlist.add(temp);temp += 1; //temp右移}return resIndexlist;}}
}

二分查找(序列是顺序的运用递归)相关推荐

  1. 二分查找(binary search)使用递归以及非递归和时间复杂度求法

    **二分查找**   二分查找又称为折半查找,是一种查询效率比较高的查找方法,但是二分查找的前提是要求线性表必须采用顺序存储结构而且表中元素按照关键字有序排列. 代码如下:   该程序在循环体内的关键 ...

  2. 二分查找法、顺序查找法

    //二分查找法 第一种方法 function erfen($x,$arr){$count=count($arr);$s=0;$h=$count-1;while ( $s<= $h) {$midd ...

  3. 二分查找递归与非递归的时间比较_我们说一说Python的查找算法!

    相信大家在面试开发岗和算法岗时,评委最喜欢问的就是:您能给我说一下查找和排序算法有哪些?今天咱们就说一说Python中最常用的查找算法,下期我们再推出排序算法. 首先要明白查找是查什么?我们希望能给定 ...

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

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

  5. java实现二分查找-两种方式

    二分查找是一种查询效率非常高的查找算法.又称折半查找.起初在数据结构中学习递归时实现二分查找,实际上不用递归也可以实现,毕竟递归是需要开辟额外的空间的来 辅助查询.本文就介绍两种方法二分查找算法思想有 ...

  6. 【Cuda并行编程之一】二分查找的探究以及Cuda的简单实现相关面试题介绍

    最近开始复习基础找工作,二分查找算是最基本而且十分重要的算法了,现在完整的解析一下,作为后面复习只用.内容分为几个部分: 一.二分查找的基本过程 折半查找技术,又称为二分查找.它的前提条件是线性表中的 ...

  7. 二分查找的基本原理及实现

    原理: 有序列表中,顺序查找需要从一端到另一端按照顺序进行查找,最多需要比较n次.二分查找从中间项开始 如果该项是我们目标项,则完成查找:如果目标项大于中间项,则可以消除中间项及比中间项目小的那一部分 ...

  8. c语言实验报告 折半查找法,C语言数组之冒泡排序+折半查找法(二分查找)

    冒泡排序算法 将相邻的元素进行两两比较,大的向后"冒", 小的向前"赶". 口诀: N个数字来排队,两两比较小靠前 外层循环N-1(控制需要比较的轮数). 内层 ...

  9. Python 二分查找与方程求解(公开代码)

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 Python 二分查找与方程求解 二分查找 a为左边界 b为右边界 value为真实值 注意:二分查找只适用于顺序列表的数值查找,乱序 ...

最新文章

  1. SLAM之特征匹配(二)————RANSAC--------翻译以及经典RANSAC以及其相关的改进的算法小结
  2. java开发中的Mutex vs Semaphore
  3. csmar eco research
  4. 2021-09-30
  5. 唯美“光效”PNG免扣素材大集合,一眼爱上!
  6. FreeNAS 是什么
  7. 用QBE语言实现关系代数
  8. 利用python开发一个竞争情报系统_一个基于python的即时通信程序
  9. java异常处理中的返回值
  10. 那些年我们一起用过的Hybrid App
  11. 九某草 X站cms 渗透篇
  12. 描述性统计分析案例题_SPSS问卷数据统计分析之项目分析
  13. 爬虫实战(二)之登录百度云盘
  14. PHP WebShell 免杀
  15. 程序员的奋斗史(三十一)——人在囧途之应聘篇(一)
  16. 程序员面试需要带身份证和毕业证原件吗
  17. 2022考研这一年总结
  18. .net调用Oracle 报错:System.Data.OracleClient 需要 Oracle 客户端软件 8.1.7 或更高版本问题
  19. 魔兽插件修改服务器名字,《私人定制》如何制作自己心仪的插件
  20. Vue 修改项目名称

热门文章

  1. vue学习实现待办事项功能
  2. Fortify SCA快速入门以及常见问题解决方法
  3. Sicily 1466. Taunt Exposure Estimation
  4. 一张图了解常见色彩空间及其关系
  5. [转]IT人的学习方法
  6. 英语语法2-一般过去时
  7. Keil5创建新工程时找不到STM32芯片
  8. 2015-4-11更新的pdf
  9. java 和历_Java 儒略历和公历的换算 | 学步园
  10. 我的世界更多附魔EcoEnchants自行编译指南