简单算法——二分搜索的递归版本和非递归版本

2023-05-16

二分搜索

这是大家比较熟悉的算法了,我们今天来复习一下:

前提:二分查找要求所查找的顺序表必须是有序的。
请添加图片描述

算法思路

定义left为顺序表最左端元素位置,right为顺序表右端元素位置。定义mid = (left + right) / 2,即顺序表的中间位置,然后用所查找的值与mid所在位置处的值比较,由于列表有序,若所查找的值比mid小,则只需在表的前半部分查找,否则只需在表的后半部分查找(若第一次比较就发现两值相等则直接返回当前值所在的位置),以此类推,直至查找到所寻找的值或确定所查找的值不在该列表内为止(即查找失败)。

普通二分搜索

int Binary_search(vector<int>& num, int tag) // 二分查找
{
	int n = num.size();
	if (n == 0)
	{
		return -1;
	}
	int left = 0;
	int right = n - 1;
	int pos = -1;
	while (left <= right)//注意这里的等号,最后如果走到一起还要比较一次
	{
		int mid = (right + left) / 2;
		if (tag < num[mid])
		{
				right = mid - 1;
		}
		else if (tag > num[mid])
		{
			left = mid + 1;
		}
		else
		{
			if (mid > left && num[mid - 1] == tag)  //多个重复数字返回第一个数字下标
			{
				right = mid - 1;
			}
		
			if (mid < right && num[mid + 1] == tag)  //多个重复数字返回最后一个数字下标
			{
				left = mid + 1;
			}
			
			else
			{
				pos = mid;
				break;
			}
		}
	}
	return pos;
}

int main()
{
	vector<int> ar = { 12,12,12,12,23,23,24,24,25,25 };
	cout << Binary_search(ar, 12) << endl;
}

二分搜索算法,实际上就是对BST树(二叉搜索平衡树)(搜索树:每一个结点的值都大于左子树的结点的值,都小于右子树结点的值)从root根结点开始搜索的过程,每一次搜索只会沿着一条路径搜索下去,不可能同一次搜索多条路径。
在这里插入图片描述
二分搜索的算法的时间复杂度就是上面这棵BST树的层数/高度:
计算方式:问题规模n = 结点个数 ==> 解除出来的层数就是时间复杂度(因为每一次搜索每一层沿着一条路径)在这里插入图片描述

递归二分搜索

int Recursion_Binary_search(vector<int>&ar, int left, int right, int key)
{
	if (left > right)//查找不到
		return -1;
	int pos = -1;
	int mid = (left + right) / 2;
	while (left <= right)
	{
		if (key < ar[mid])
			return Recursion_Binary_search(ar, left, mid - 1, key);
		else if (key > ar[mid])
			return Recursion_Binary_search(ar, mid + 1, right, key);
		else //查找到
		{
			if (mid > left && ar[mid - 1] == key)  //多个重复数字返回第一个数字下标
			{
				Recursion_Binary_search(ar, left, mid - 1, key);
			}
			else
			{
				pos = mid;
				break;
			}
		}
	}
	return pos;
}

int main()
{
	vector<int> ar = { 12,12,12,12,23,23,24,24,25,25 };
	cout << Recursion_Binary_search(ar, 0, ar.size() - 1, 25) << endl;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

简单算法——二分搜索的递归版本和非递归版本 的相关文章

  • 什么是juc

    juc是用于处理线程的工具包
  • 缓存数据一致性解决方案

    读写锁 xff0c 读相当于无锁状态 xff0c 写加上锁 读多写多 xff0c 直接去数据库查询 读多写少 xff0c 完全可以使用Spring Cache
  • 什么是nginx动静分离

  • 检索DSL是什么

    DSL是ElasticSearch的高级搜索
  • 线程池的工作顺序

  • sku和spu的区别

    spu和sku就是上下级关系 xff0c spu是上级 xff0c sku是下级 假如没有选择任何类型那么他就是一个单独的spu xff0c 但是当它选择了具体的颜色 xff0c 版本 xff0c 购买方式等等 xff0c 那么他就是一个s
  • hexo next 博客,jsdelivr cdn报错无法访问

    一 博客环境 我的hexo版本是5 4 0 xff0c next版本是7 8 0 因 jsdelivr cdn报错导致博客首页无法访问 二 修改next cdn 首先进入hexo博客首页 xff0c F12查看报错的 jsdelivr 地址
  • busuanzi.ibruce.info 有时候报502,怎么解决

    一 现象 https busuanzi ibruce info 访问经常出现502 导致个人博客的访问人数无法正常显示 二 如何解决 用chrome 打开busuanzi ibruce info xff0c 点url链接前的那个锁 然后看到
  • BigDecimal和Double的区别

    Double span class token number 0 3 span span class token number 0 2 span span class token operator 61 span span class to
  • 对科里奥利力的理解

    首先创造一个情景 xff0c 方便理解 假设你站在一个这样的封闭靶场 xff08 全封闭 xff09 上 xff0c 这个靶场在以大小为 的角速度做匀速圆周运动 xff08 速度不大不小 xff0c 你感觉不到 xff0c 而且靶场没风 x
  • typora使用技巧

    1 Typora vue theme的介绍与下载 typora vue theme是参考了Vue文档风格而开发的一个 Typora 自定义主题 点击此处下载 2 如何安装 a 下载本主题中的vue css vue dark css文档和包含
  • 序列化什么意思

    序列化就是一种用来处理对象流的机制 xff0c 将对象转化成字节序列后可以保存在磁盘上 xff0c 或通过网络传输 xff0c 以达到以后恢复成原来的对象
  • mybatis plus 事务回滚总结

    https www cnblogs com c2g5201314 p 13163097 html
  • throw 和 try catch 的区别

    try catch是直接处理 xff0c 处理完成之后程序继续往下执行 xff0c throw则是将异常抛给它的上一级处理 xff0c 程序便不往下执行了
  • throw的异常日志会打印吗

    throw 就是要把异常继续抛出 xff0c 要么由上层方法解决 xff0c 要么会终止程序运行
  • java assert什么意思

    assert 意为断言的意思 xff0c 这个关键字可以判断布尔值的结果是否和预期的一样 xff0c 如果一样就正常执行 xff0c 否则会抛出AssertionError assert 的使用 xff1a span class token
  • throw和throws的区别

    throws xff1a 用来声明一个方法可能产生的所有异常 xff0c 不做任何处理而是将异常往上传 xff0c 谁调用我我就抛给谁 用在方法声明后面 xff0c 跟的是异常类名 可以跟多个异常类名 xff0c 用逗号隔开 表示抛出异常
  • 1024有感

    2022 10 24 1024节日快乐 xff01 好好学习 xff0c 天天向上 x1f600
  • 互联网项目一般几轮测试

    第一轮测试 xff1a 要覆盖所有测试用例 所有功能都要跑一遍 第二轮测试 xff1a 重点功能的测试 还要把第一轮测试发现的问题 xff0c 根据开发修改完成的结果 xff0c 进行验证 最后一轮是回归测试 xff1a 验证所有bug是否
  • IDEA pom文件 ctrl alt l无法格式化

    File gt Manage IDE settings gt Restore Default settings 恢复IDEA默认设置后 xff0c 即可格式化pom文件

随机推荐