二分查找(Binary Search),又称折半查找,是一种效率较高的查找算法。折半查找需要线性表采用顺序存储结构,即查找的对象必须是一个有序序列。如{1,2,3,4,5...},{10 ,8,6,4,2,0}等有序数组。故其优点为查找速度快,缺点是数据序列必须是有序数组。

算法思想:查找过程 首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。 重复以上过程,直到找到满足条件的记录。

算法流程图如图所示:

实验代码如下:

  1. 递归形式

int BinarySearch_Rec(int num[], int target, int left, int right)
{while (left <= right){int mid = left + (right - left) / 2;if (num[mid] == target)return mid;else if (num[mid] > target)return BinarySearch_Rec(num, target, left, mid - 1);else if (num[mid] < target)return BinarySearch_Rec(num, target, mid + 1, right);}return -1;
}
  1. 非递归形式

int BinarySearch(int num[], int target, int len) //非递归实现
{int left = 0;int right = len - 1; // 第一个细节点while (left <= right) // 第二个细节点{int mid = left + (right - left) / 2;if (num[mid] == target)return mid;else if (num[mid] > target)right = mid - 1; // 第三个细节点else if (num[mid] < target)left = mid + 1; // 第四个细节点}return -1;
}
  1. 实验测试代码如下

#include <iostream>
#define GET_ARRAY_LEN(array, len) {len = sizeof(array) / sizeof(array[0]);}using namespace std;int BinarySearch(int num[], int target, int len); //非递归实现
int BinarySearch_Rec(int num[], int target, int left, int right);// 递归实现int main()
{int num[] = {1, 2, 3, 4, 5, 6, 7};int len;GET_ARRAY_LEN(num, len)//找到5的位置int loc = BinarySearch_Rec(&num[0], 7, 0, len);cout << loc << endl;return 0;
}

总结:二分查找算法思想简单,但在实际编写过程中有很多细节需要注意

  1. 在检索时区间推荐设置为闭区间[left, right],此时right = len - 1。

  1. while判断检索区间不为空时,尽量使用 “<=”,若使用“<”,有可能会出现右侧端点检索不到的问题。

  1. 循环中的条件判断尽可能使用多条件判断语句 if...else if...else if 。

  1. 递归调用时,注意参数的写法。

  1. 计算中间索引mid时,尽量使用mid = left + (right - left)/ 2,可以与容器的迭代器实现保证一致。

二分查找算法递归实现相关推荐

  1. 二分查找算法递归和非递归实现

    自己接触和了解过的查找算法总结起来分为3个吧: 1. 静态查找(主要是二分查找,效率较高) 2. 动态查找(二叉查找树) 3. 哈希表 首先来说二分查找吧! 基本思想:假设在一个已经排好序的有序序列( ...

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  9. 递归与分治——二分查找算法(折半查找算法)

    二分搜索主要解决的问题是确定排序后的数组中是否包含目标元素val. 二分搜索通过持续跟踪数组中包含元素val的范围.分为两个过程,第一就是找到了,第二个就是没找到: 一开始,这个范围是整个数组,然后通 ...

最新文章

  1. mysql场景测试_【干货】不同场景下 如何进行MySQL迁移
  2. Latex 数学符号表
  3. 51nod 1087 1 10 100 1000
  4. css制作圆角矩形,CSS绘制圆角矩形图形的效果
  5. HTML5学习笔记(五):CSS基础
  6. 正在创建系统还原点_如何使Windows在启动时自动创建系统还原点
  7. java imageview的使用_Android使用控件ImageView加载图片的方法
  8. 指针变量使用规则实例
  9. Unity HoloLens 开发初识
  10. Chrome浏览器如何完美实现截长屏幕
  11. ZDNS宣布完成B轮融资,根服务器之外,顶级域名系统迎重要机遇
  12. 《激荡三十年》十九、脚下的路——对中国经济未来的猜想
  13. Vue.js 作者尤雨溪:直接学 Vue 3 吧
  14. JAVA自行车租借管理系统计算机毕业设计Mybatis+系统+数据库+调试部署
  15. eclipsemaven服务器显示404,eclipse-HTTP状态404-请求的资源(/)不可用
  16. oracle 密码解锁
  17. vue--echarts 图标库、excel导出、面包屑组件、富文本框、地图、前端使用代理访问、监控生产环境or开发环境
  18. Windpy + Pycharm(No such file报错解决方式)
  19. app常见的专项测试以及面试题
  20. 《中国制造2025》提出构建绿色制造体系,成为我国制造业新趋势

热门文章

  1. 当日、昨日、当周、本周、当月、上个月获取方法
  2. CPU四芯转接头不良引起的无法开机故障
  3. Field tagService in xxx.service.impl.ArticleServiceImpl required a bean of type ‘xxserviceTagService
  4. 解决 Idea 下 Tomcat 乱码(淇℃伅璀﹀憡)问题
  5. 玩好信用卡,它就是你东山再起的资本
  6. 批量保存拼多多批发商城商品主图及视频
  7. 中国宠物用品品牌“Touchdog它它”完成数千万元Pre-A 轮融资...
  8. springboot项目配置(yml,pom)
  9. 【访问本地项目,localhosthost可以,本地ip不可以】
  10. Springboot2.x+Websocket+js实现实时在线文本协同编辑,并展示协同用户