二分查找算法递归实现
二分查找(Binary Search),又称折半查找,是一种效率较高的查找算法。折半查找需要线性表采用顺序存储结构,即查找的对象必须是一个有序序列。如{1,2,3,4,5...},{10 ,8,6,4,2,0}等有序数组。故其优点为查找速度快,缺点是数据序列必须是有序数组。
算法思想:查找过程 首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。 重复以上过程,直到找到满足条件的记录。
算法流程图如图所示:
实验代码如下:
递归形式
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;
}
非递归形式
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;
}
实验测试代码如下
#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;
}
总结:二分查找算法思想简单,但在实际编写过程中有很多细节需要注意
在检索时区间推荐设置为闭区间[left, right],此时right = len - 1。
while判断检索区间不为空时,尽量使用 “<=”,若使用“<”,有可能会出现右侧端点检索不到的问题。
循环中的条件判断尽可能使用多条件判断语句 if...else if...else if 。
递归调用时,注意参数的写法。
计算中间索引mid时,尽量使用mid = left + (right - left)/ 2,可以与容器的迭代器实现保证一致。
二分查找算法递归实现相关推荐
- 二分查找算法递归和非递归实现
自己接触和了解过的查找算法总结起来分为3个吧: 1. 静态查找(主要是二分查找,效率较高) 2. 动态查找(二叉查找树) 3. 哈希表 首先来说二分查找吧! 基本思想:假设在一个已经排好序的有序序列( ...
- 二分查找算法的两种实现方式:非递归实现和递归实现
二分查找的条件是对一组有序数组的查找,这一点很容易忘记,在使用二分查找的时候先要对数组进行排序. 先说一下二分查找的思路:一个有序数组,想要查找一个数字key的下标,首先算出中间下标mid,利用mid ...
- 二分查找算法(递归与非递归两种方式)
首先说说二分查找法. 二分查找法是对一组有序的数字中进行查找,传递相应的数据,进行比较查找到与原数据相同的数据,查找到了返回1,失败返回对应的数组下标. 采用非递归方式完成二分查找法.java代码如下 ...
- 递归来实现一个二分查找算法函数bi_search()
题目内容: 定义一个 prime() 函数求整数 n 以内(不包括n)的所有素数(1不是素数),并返回一个按照升序排列的素数列表.使用递归来实现一个二分查找算法函数bi_search(),该函数实现检 ...
- 二分查找算法(递归+非递归)
二分算法步骤描述 前提:有序数组中查找关键词所在的位置 ① 首先确定整个查找区间的中间位置 mid = strat+(end-strat)/2 ② 用待查关键字key值与中间位置的关键字值进行比较: ...
- 二分查找算法(非递归)
1.二分查找算法(非递归)介绍 前面我们讲过了二分查找算法,是使用递归的方式,下面我们讲解二分查找算法的非递归方式 二分查找法只适用于从有序的数列中进行查找(比如数字和字母等),将数列排序后再进行查找 ...
- python递归实现二分查找_python二分查找算法的递归实现
本文实例讲述了python二分查找算法的递归实现方法.分享给大家供大家参考,具体如下: 这里先提供一段二分查找的代码: def binarySearch(alist, item): first = 0 ...
- python递归实现二分查找_python二分查找算法的递归实现方法
本文实例讲述了python二分查找算法的递归实现方法.分享给大家供大家参考,具体如下: 这里先提供一段二分查找的代码: def binarySearch(alist, item): first = 0 ...
- 递归与分治——二分查找算法(折半查找算法)
二分搜索主要解决的问题是确定排序后的数组中是否包含目标元素val. 二分搜索通过持续跟踪数组中包含元素val的范围.分为两个过程,第一就是找到了,第二个就是没找到: 一开始,这个范围是整个数组,然后通 ...
最新文章
- mysql场景测试_【干货】不同场景下 如何进行MySQL迁移
- Latex 数学符号表
- 51nod 1087 1 10 100 1000
- css制作圆角矩形,CSS绘制圆角矩形图形的效果
- HTML5学习笔记(五):CSS基础
- 正在创建系统还原点_如何使Windows在启动时自动创建系统还原点
- java imageview的使用_Android使用控件ImageView加载图片的方法
- 指针变量使用规则实例
- Unity HoloLens 开发初识
- Chrome浏览器如何完美实现截长屏幕
- ZDNS宣布完成B轮融资,根服务器之外,顶级域名系统迎重要机遇
- 《激荡三十年》十九、脚下的路——对中国经济未来的猜想
- Vue.js 作者尤雨溪:直接学 Vue 3 吧
- JAVA自行车租借管理系统计算机毕业设计Mybatis+系统+数据库+调试部署
- eclipsemaven服务器显示404,eclipse-HTTP状态404-请求的资源(/)不可用
- oracle 密码解锁
- vue--echarts 图标库、excel导出、面包屑组件、富文本框、地图、前端使用代理访问、监控生产环境or开发环境
- Windpy + Pycharm(No such file报错解决方式)
- app常见的专项测试以及面试题
- 《中国制造2025》提出构建绿色制造体系,成为我国制造业新趋势
热门文章
- 当日、昨日、当周、本周、当月、上个月获取方法
- CPU四芯转接头不良引起的无法开机故障
- Field tagService in xxx.service.impl.ArticleServiceImpl required a bean of type ‘xxserviceTagService
- 解决 Idea 下 Tomcat 乱码(淇℃伅璀﹀憡)问题
- 玩好信用卡,它就是你东山再起的资本
- 批量保存拼多多批发商城商品主图及视频
- 中国宠物用品品牌“Touchdog它它”完成数千万元Pre-A 轮融资...
- springboot项目配置(yml,pom)
- 【访问本地项目,localhosthost可以,本地ip不可以】
- Springboot2.x+Websocket+js实现实时在线文本协同编辑,并展示协同用户