C++ 递归版二分查找保姆级解析

C++中二分查找(递归,非递归) 二分查找:二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。 二分查找要求: 1.必须采用顺序存储结构 2.必须按关键字大小有序排列。 这是我们二分查找的步骤 假设表中元素是按升序排列,将表中间位置记录mid与查找关键字key比较,如果两者相等,则查找成功;否则利用中间位置mid将表分成前、后两个子表,如果中间位置mid大于查找 阅读详情

 出了两期的较难的算法,这次出个简单的吧(实际上是我没素材了,这次来说白了就是来找素材的)

递归,想必大家都很熟悉,我这次用递归来做一次二分查找的算法。

首先,给出初始代码模板:

#include<bits/stdc++.h>
using namespace std;
int main() {
    return 0;
}

这个bits/stdc++.h头文件是万能头文件,只不过不包含windows.h等一些头文件,一般来说,bits/stdc++.h头文件是通用的。

对于二分查找,我们肯定以及必须定义一个数组,至于数组长度嘛,可定义也可不定义,我们在这就定义一个n吧,然后定义一个要找得数k、要找得数的编号idx, 初值为-1。

输入加定义代码:

#include<bit/stdcc++.h>
using namespace std;
int a[1000005], n, k, idx=-1;
int main() {
    cin>>n>>k;
    for(int i=1; i<=n; i++)    cin>>a[i];
    return 0;
}

 学过递归的都知道,递归一般都要定义一个函数,我们就叫它f函数吧,返回值为void类型。

f函数要两个参数:左边界L,右边界R。

先判断一下L是否大于R,如果是,那么退出。

在f函数中定义一个数mid,译为中间,mid=(L+R)/2。

判断一下a[mid]是否等于k,如果是,那么将idx赋值为mid,退出。

递归f(L, mid-1)和f(mid+1, R)。

最后在主函数main中运行函数f,参数分别为1和n,最后输出。

输出时要注意:如果idx=-1,那么说明没有找到k,输出没有,否则输出idx.

最终将代码附上:

#include<bit/stdcc++.h>
using namespace std;
int a[1000005], n, k, idx=-1;
void f(int L, int R) {
    if(L>R)    return;
    int mid=(L+R)/2;
    if(a[mid]==k) {
        idx=mid;
        return;
    }
    f(L, mid-1);
    f(mid+1, R);
}
int main() {
    cin>>n>>k;
    for(int i=1; i<=n; i++) cin>>a[i];
    f(1, n);
    cout<<"查找结果:";
    if(idx==-1)    cout<<"没有发现 "<<k;
    else cout<<k<<" 在编号 "<<idx<<" 位置";
    return 0;
}

本人是个菜鸟,如果有不对的地方,求大神指点。

接下来问大家一个问题:对于我的另一篇Vigenère密码文章,是先出中文版在出解析,还是先出解析再出中文版呢,发个投票吧:

蓝桥杯C++ AB组辅导课 今天在AcWing闲逛白嫖到了yxc老师的蓝桥杯C++ AB组辅导课的题单,正好快要蓝桥杯了,我准备每天花半个小时刷5道这个题单里的水题,练一练,不然到时候我各种花里胡哨的算法学了一堆,水题切不动就gg了。 一共86道水题,每天5道半个月水完吧 这是蓝桥杯C++ AB组辅导课的链接感兴趣的可以报个名,y老师的课还是很有质量保证的 这个课我就没必要报来听了,刷刷题就好。 第一讲、递归与递推 第一章是递归,我最讨厌的就是递归了。。。 1.AcWing 92. 递归实现指数型枚举 dfs,直接用状态压缩。 d 阅读详情

相关推荐

二分查找算法C++,递归和迭代

//二分查找 #include<iostream> const int MAXN=10010; using namespace std; //二分查找,递归实现 int binarySearch(int a[],int low,int high,int key) { //查找某元素是否在数组中,若存在,则返回下标,否则返回-1; int mid=(low+high)/2; if(low>high){ return -1;//该元素不在数组中 } if(a[mid]==key) return mid; else if(a[mid]>key) return binarySearch(a,low,mid-1,key); else return binarySearch(a,mid+1,high,key); return -1;//该元素不在数组中 } //二分查找,迭代实现 int binarySearch2(int a[],int low,int high,int key) { //查找某元素是否在数组中,若存在,则返回下标,否则返回-1; if(low>high){ return -1;//该元素不在数组中 } while(low<=high) { int mid=(low+high)/2; if(a[mid]==key) return mid; else if(a[mid]>key) high=mid-1; else low=mid+1; } return -1;//该元素不在数组中 } int main() { int n,i; int num,a[MAXN]; int find=0;//查找标志 cout<<"二分查找法,请输入数列个数\n"; cin>>n; for(i=0;i<n;i++) cin>>a[i]; while(true) { cout<<"\n请输入要查找的数:"<<endl; cin>>num;//读入要查找的数 //find=binarySearch(a,0,n-1,num); find=binarySearch2(a,0,n-1,num); if(find==-1) cout<<"抱歉!查无此数\n"; else cout<<"恭喜你,查找成功!数列第"<<find+1<<"个\n"; } return 0; }

C++数据结构4 二分查找(递归方法)

二分查找比顺序查找效率高很多 同样的100万个数据,顺序查找需要50万次,而二分查找需要20次左右既可以了。但是二分查找需要的数据是已经排列好的,无序的数据则用不了二分查找。 #include &lt;iostream&gt; /* 二分查找:必须是已经排序好的数,有递归和迭代(循环)两种方式,递归的效率比迭代的效率高得多 */ using namespace std; int ...

Birate的博客 1248

折半(二分)查找的c++代码(递归和非递归)实现

这里本人自己写的是折半查找算法(又称二分查找)的c++代码的实现, 用的是递归的方法和非递归的方法, 里面的代码已经编译通过,并且优化好, 有需要的朋友可以下载借鉴一下

【算法C++实现】2、二分查找与简单递归

当满足终止条件时,递归开始回溯,逐层返回最终结果,同时每层的局部变量和参数也被销毁,函数栈帧依次出栈。在编程中,递归是非常常见的一种算法,由于代码简洁而应用广泛,但递归相比顺序执行或循环程序,时间复杂度难以计算,而master公式就是用于计算递归程序的时间复杂度。这个步骤时,只有一个元素了 L==R,看代码 该元素即为当前(0,0)区间的最大值了,返回给。,拿到rightMax,最后对左右区间的最大值做比较,拿到(0,1)区间的最大值,又返回给。,只要目标问题在某一边必有解,另一边无所谓,就能够使用二分。

记录值得记录的东西 3095

C 二分查找 递归与非递归的实现代码

C 二分查找 递归与非递归的实现代码,需要的朋友可以参考一下

C++ 中二分查找递归非递归实现并分析

主要介绍了C++ 中二分查找递归非递归实现并分析的相关资料,需要的朋友可以参考下

c++ 二分查找(迭代与递归)

并根据结果返回找到键的索引或调用下一个搜索空间的递归函数。考虑一个数组arr[] = {2, 5, 8, 12, 16, 23, 38, 56, 72, 91},目标 = 23。如果键小于 mid 元素,则向左移动,如果大于 mid 则将搜索空间向右移动。二分搜索可以用作机器学习中使用的更复杂算法的构建块,例如训练神经网络或查找模型的最佳超参数的算法。3、如果在中间元素没有找到键,则选择哪一半将用作下一个搜索空间。如果key与mid元素的值匹配,则找到该元素并停止搜索。

csdn_aspnet的专栏,请点击博客主页右上角三个点中的私信联系 1万+

三维点云孔洞修复(附Python代码和公共点云数据集链接)

(1)物体自身缺失(2)物体自身形状复杂,很多凹凸面不够规则甚至存在空腔,空腔内部无法被三维激光扫描仪扫描到(3)物体部分区域对激光扫描不敏感,未被扫描上(4)扫描仪的扫描稳定性。

yanghl1215的博客 6952

二分查找(C++实现,递归,非递归)

(本博客旨在个人总结回顾) 一、概念 二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。 二、实现 // BinarySearch.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include <iostream&g...

qq_23903863的博客 1006

【AutoDL + Langchain-Chatchat】从零构建高效本地 RAG 知识库问答系统:实战保姆级教程(含避坑指南)

本文详细阐述如何在AutoDL云平台,如何利用Langchain-Chatchat构建高效的本地RAG知识库问答系统,并深入解析RAG架构。从环境搭建到实战部署,从问题排查到性能优化,提供一份全面实用的指南,助力开发者快速构建智能问答应用。

拾光夕拾的博客 1803

Godot 4.x 实现 JRPG 回合制战斗系统:架构、状态机与实战优化

游戏开发中,状态机是管理复杂逻辑流转的核心设计模式,尤其在回合制战斗这类事件驱动的场景中。其原理是通过定义有限的状态和明确的转移条件,来控制系统在不同阶段的行为,从而实现清晰、可维护的流程控制。这项技术的价值在于能够将杂乱的条件判断代码结构化,降低模块间的耦合度,提升代码的可读性和可扩展性。在游戏开发领域,状态机广泛应用于角色AI、UI流程、战斗系统等场景。本文以Godot引擎为例,深入探讨如何运用节点与信号驱动架构,构建一个健壮的JRPG(日式角色扮演游戏)回合制战斗系统。内容涵盖从核心的**状态机**设

weixin_33749242的博客 499

【C++】二分查找的递归形式和非递归形式

二分查找 二分查找,又名折半查找,在有序数组中查找元素的效率很高;缺点就是只能查询有序表,因此适用于不用频繁插入删除的有序表 如果没有二分查找,通过遍历来查询表中元素的时间复杂度为O(N) 而二分查找时间复杂度为O(lgN) 以非递归的形式实现二分查找 //二分查找的非递归形式 int BinaryResearchNonR(int *arr,int left, int righ

皓皓松的博客 2292

【漆学军】MT4进阶到MT5速成之路(2)获取持仓

MT5在持仓获取上,要比MT4复杂些,分两部分,获取持仓和挂单采用了不同的方法。 一、获取持仓中的buy和sell单 int b=0;//获取buy单个数 int s=0;//获取sell单个数 double lot_total_buy=0;//获取持仓中buy单的总手数 double lot_total_sell=0;//获取持仓中sell单的总手数 for(int i=0; i<PositionsTotal(); i++) { ulong ticket=Positi

漆学军的编程笔记 1625

C++知识精讲14 | 算法篇之二分查找算法

二分查找又称折半查找(Binary Search),优点是比较次数少,查找速度快,平均性能好,占用系统内存较少;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止

Yu仙笙的博客 1604

让 ABAP Screen Variant 安稳上车:SHD0 与 SHD0_MANDT 的 Transport 全攻略

摘要: SAP项目常需优化交易码界面,通过SHD0的Transaction Variant和Screen Variant可实现字段精简、默认值预设及权限控制,避免修改标准代码。但跨系统迁移时易出现变式丢失或版本兼容问题。核心概念包括: Screen Variant:针对单个屏幕的字段属性配置(跨Client); Transaction Variant:串联多屏幕变式(分跨Client和Client-specific); 版本差异:4.70/6.x后需区分SHD0(跨Client)与SHD0_MANDT(Cl

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 225

流体仿真软件:COMSOL Multiphysics二次开发_(11).COMSOL与外部软件的数据交换

通过上述方法,您可以实现 COMSOL Multiphysics 与外部软件的数据交换,从而更好地集成和分析仿真结果。无论是从文本文件导入数据,导出数据到 MATLAB,还是通过 API 和 COMSOL Server 实现实时通信,都能满足不同场景下的需求。希望这些内容对您在流体仿真领域的开发工作有所帮助。

kkchenjj的博客 1553

C/C++ 二分查找算法(非递归实现)

用最简单的方式实现二分查找算法!

cpp_learner的博客 3251

财务数字化——解读美的战略规划之财务组织体系建设【附全文阅读】

本文提出适用于集团企业的财务管控方案,面向财务负责人、HR及战略规划人员。方案整合四种管控模式,结合500强案例,构建"职能定位-架构设计-权责划分-人才发展"体系,涵盖财务五大模块。通过明确总部与事业部权责边界,提供组织架构等实操框架,旨在平衡财务管控与业务支持,提升效率与风控能力,满足集团财务体系规范化建设需求。

cdfunlove的博客 663

C++数据结构--二分查找的递归和非递归实现

#include using namespace std; /*  *二分查找的非递归实现  *i表示数组开始下标  *j表示数组结束下标  *k表示查找关键字  *m表示数组中间下标  */ int BSort(int arr[],int i,int j,int k) { int m=(i+j)/2; while(i { m=(i+j)/2; if(k==a

piniheaven的专栏 820

基于STM32L4XX、HAL库的BQ25713RSNR充电芯片驱动程序设计

define BQ25713_I2C_ADDR (0x6B << 1) // 7位地址为 0x6B,HAL库需要左移一位。// 示例:配置 CHARGE_OPTION_0 寄存器:使能充电,使能 ICO(输入电流优化)reg_data |= (EN_CHG_MASK | EN_ICO_MASK);

zhusl6688的博客 406

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

二分法:二分查找(递归+非递归)实现

二分查找又称折半查找,首先,假设表中元素是按升序排列,将 表中间位置的关键字与查找关键字比较: 如果两者相等,则查找成功; 否则利用中间位置将表分成前、后两个子表: 1)如果中间位置的关键字大于查找关键字,则进一步查找前一子表 2)否则进一步查找后一子表 重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。 例如:target = 200 arr = [-1...

天行健,地势坤 766

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

二分查找(折半查找)的递归和非递归实现(c++)

1步骤描述 使用前提:有序数组中查找关键词所在位置。 1.首先确定整个查找区间的中间位置 mid = start+(end-start)/2。 2使用待查关键字key值与中间位置的关键字值进行比较。 3 若相等,则查找成功 若大于,则在后(右)半个区域继续进行折半查找 若小于,则在前(左)半个区域继续进行折半查找 4 对确定的缩小区域再按折半公式,重复上述步骤。 2 非递归二分查找算法 int bin_search1(int key,int arr[],int length){ int start

zou_albert的博客 1566

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

二分查找递归与非递归模板

递归 public static int dfs(int[] arr,int key,int low,int high){ if(key < arr[low] || key > arr[high] || low > high){ return -1; } int middle = (low + high) / 2; //初始中间位置 if(arr[middle] > key){ //比关键字大则关键字在左区域 return

russwest44的博客 149

C++实现二分查找

二分查找(Binary Search)是一种在有序数组中查找特定元素的算法。它的基本思想是将待查找区间的中间元素与目标值进行比较,根据比较结果缩小查找范围,直到找到目标值或者确定目标值不存在为止。

Chinese_chen_的博客 724

递归与分治算法解析

递归与分治算法解析 递归 递归的概念:直接或者间接调用自身算法称为递归算法,像俄罗斯套娃一样一层一层 分治 分治:将一个难以解决的大问题分割成一些规模较小的相同的问题,以便各个击破,即份分而治之 分治法使用的场景 该问题的规模缩小到一定程度就可以容易的解决; 该问题可以分解为若干个规模较小的相同问题,即该问题具有最优子结构性质; 利用该问题分解出子问题的解,可以合并为该问题的解; 该问题所分解出的各个子问题是相互独立的,即子问题之间不包含公共的子子问题; 分治与递归像是一堆孪生兄弟,经

pjh88的博客 2853

c++常用库函数(超级详细版)

合并函数的核心思想是设置两个头指针,分别指向两个升序数组首地址,通过比较两个头指针的大小,每次都将小的数值放入新的数组,然后小数值指针后移,最后新的数组也是有序的,从而完成合并过程,复杂度为。无序数组的包含问题就像是字符串应用中的最长公共子序列,解法是动态规划,而有序数组的包含则是简单的判断问题,解法类似有序数组的合并。,其作用是将两个集合交成一个集合,同样的要求输入的两个集合必须是有序的。,其作用是计算出两个集合的对称差集,同样的,要求输入的两个集合必须是有序的。

m0_74036487的博客 2万+
上一篇: c++计算器
下一篇: C++回文数
c++程序师
博客等级 码龄4年 246粉丝 23原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值