二分查找将一个有序数组查找的时间复杂度从O(n)降到了O(logn). 首先是最基本的二分查找:

public int binarySearch(int[] arr, int target, int n){//n是数组总长度int low = 0, high = n-1, mid;while(low <= high){mid = low + (high - low) / 2;if(arr[mid] == target){return mid;}else if(arr[mid] > target){//目标比中间值小了high = mid - 1;}else{//目标比中间值大了low = mid + 1;}}return -1;
}

如果用递归的方式去实现,则代码如下:

public static int getKey(int[] arr, int target, int low, int high) {//求中间元素的下标int mid = low + (high - low) / 2;//数组内不含有指定元素,依据下标的规则,退出if (low > high)return -1;//查找到指定元素if (target == arr[mid]) {return mid;//当查找的元素大于中间下标的元素,则改变开始下标的位置} else if (target > arr[mid]) {return getKey(arr, target, mid + 1, high);} else {//当查找的元素小于中间下标的元素,则改变结束下标的位置return getKey(arr, target, low, mid - 1);}}

关于二分查找还有很多有趣的例题,比如:

查找目标值的左边界:

比如arr = {1,2,3, 5,6,7,7,7,7,7,8,8,10}; 寻找第一个7的下标.

public int binarySearchLowerBound(int[] A, int target, int n){int low = 0, high = n, mid;while(low <= high){mid = low + (high - low) / 2;//这里变了,如果是相等,同样高位要左移,因为要找到目标的最左边的    if(target <= A[mid]){high = mid - 1;}else{low = mid + 1;}}if(low < A.length && A[low] == target)return low;elsereturn -1;
}

同理查找目标值区域的右边界:

public int binarySearchUpperBound(int[] A, int target, int n){int low = 0, high = n, mid;while(low <= high){mid = low + (high - low) / 2;if(target >= A[mid]){low = mid + 1;}else{high = mid - 1;}}if(high >= 0 && A[high] == target)return high;elsereturn -1;
}

二分查找 递归与非递归实现相关推荐

  1. JAVA常用算法一:二分查找【递归 or 非递归】

    文章目录 一.Java实现二分查找[递归] 二.Java实现二分查找[非递归] 三.测试 一.Java实现二分查找[递归] //递归使用二分查找public static int binarySear ...

  2. 算法006:二分查找 递归、非递归

    题目: 已知一个有序数组arr 给定需要搜索的元素,返回索引,若无则返回-1思路: 递归和非递归 1.代码如下 BinSearch .java: package com.yuhl.right;/*** ...

  3. (C语言)BinarySearch二分搜索/折半查找 --- 递归、非递归

    1 /*2 * FILE: BinarySearch.C3 * DATE: 201803064 * ==============5 * DESCRIPTION: 折半查找_递归.非递归实现6 * 二分 ...

  4. 递归折半查找法 c语言程序,折半查找法的递归和非递归形式

    /* 1.折半查找的查找过程是:先确定待查记录所在区间,然后逐步缩小范围至到找到或者找不到该记录为止. 2.折半查找的性能分析可以由判定树得出,折半查找在查找成功时给定值进行比较的关键字个数至多为⌊l ...

  5. C#实现(递归和非递归)快速排序和简单排序

    C#实现(递归和非递归)快速排序和简单排序 本人因为最近工作用到了一些排序算法,就把几个简单的排序算法,想冒泡排序,选择排序,插入排序,奇偶排序和快速排序等整理了出来,代码用C#代码实现,并且通过了测 ...

  6. 二叉树创建及遍历算法(递归及非递归)(转)

    //二叉树处理头文件 //包括二叉树的结构定义,二叉树的创建,遍历算法(递归及非递归), /* 作者:成晓旭 时间:2001年10月7日(18:49:38-20:00:00) 内容:完成二叉树创建,二 ...

  7. 二叉树的先中后序递归和非递归遍历(数据结构作业)

    一.设计思想 我创建二叉树是用的先序创建,其中用'#'代表空节点. 1.递归先序遍历 (1)如果当前节点为空节点(用'#'代表空节点),结束当前函数 (2)打印当前节点 (2)递归当前节点的左子树 ( ...

  8. 树的递归与非递归遍历算法

    树的递归与非递归遍历算法 树的递归与非递归遍历算法 树的遍历 实例 树遍历的口诀 树的递归遍历代码 树的先序遍历 树的中序遍历 树的后序遍历 递归遍历思想 树的非递归遍历 树的先序非递归遍历 先序遍历 ...

  9. c语言中fact函数怎么调用,C语言程序题: 1、编写一个求n!的函数fact(n),要求fact函数分别用递归和非递归两种方法实现...

    点击查看C语言程序题: 1.编写一个求n!的函数fact(n),要求fact函数分别用递归和非递归两种方法实现具体信息 答:int fac(int n) //非递归{int f=1; for(;n;) ...

  10. (伪代码)树的前中后遍历和层次遍历算法实现(考研适用,递归和非递归)

    文章目录 前言 一.递归实现树的遍历 二.非递归实现 层次遍历 总结 前言 2022考研初试结束,总结了一些考研中基本常用算法.这篇主要是关于树的前中后遍历,递归实现和非递归实现两种,现在很多自命题在 ...

最新文章

  1. Docker查看远端仓库的标签工具
  2. 设置Windbg符号文件路径
  3. plsql怎么查看存储过程中long变量的值_面试官:详细说下基本数据类型与装箱拆箱的过程...
  4. 安装这些App的注意了!隐私窃取 捆绑推广 已被下架 现在卸载还来得及!
  5. Android 10 重磅来袭:支持 5G 与折叠屏、隐私安全全面升级!
  6. 【笔记】LR配置ODBC连接数据库进行参数化(mysql )未完待续
  7. C# 创建Excel文件
  8. git 日常 常用命令
  9. Django学习笔记7
  10. Spring @Aspect实现切面编程
  11. python中的多线程(一)
  12. go程序员面试算法宝典 pdf_Go程序员面试算法宝典
  13. 并发编程之美-终章chat
  14. matlab mosek安装
  15. 超链接去掉下划线代码
  16. python转txt到xml并编译为exe
  17. android dialog的格式显示,详解Android Dialog对话框的五种形式
  18. WPS vbe6ex.olb 不能加载
  19. Ubuntu 系列学习(五)ubuntu22.04安装flameshot火焰截图(图文)
  20. 不懂就要问!流量卡拒收对个人会有影响吗?

热门文章

  1. python骗局-说真的!大家做Python一定不要只会一个方向
  2. 零基础学python要多久-零基础如何学Python?小白学Python需要多久?
  3. python电脑配置-入门学python需要什么配置的电脑?
  4. 学python语言有前途吗-学习python的前景怎么样?
  5. 人物 | 当我们在谈论语音识别时,我们在谈些什么?——知乎达人、CMU博士生王赟...
  6. 杭州有那些APP外包公司?
  7. mysql编译安装vs20156_Linux上安装JDK1.8,tomcat9,以及mysql8的步骤
  8. Vue将echarts数据导出成excel文件
  9. 【PYTHON笔记】文件读写,定位
  10. jQuery 表格排序插件 Tablesorter 使用