当前位置: 首页 > news >正文

基础三⼤查找

内查找和外查找:查找也有内查找和外查找之分。若整个查找过程都在内存中进⾏,则称之为内查找(internal search);反之,若查找过程的需要访问外存,则称之为外查找(external search)。

1、顺序查找

从表中的第⼀个(或者最后⼀个)记录开始,逐个进行记录的关键字和给定值的比较,若某个记录的关键字和给定值比较相等,则查找成功。

#include<iostream>#include<vector>usingnamespacestd;// 顺序查找:通用,有序、无序数组都可用intseqSearch(vector<int>&arr,intkey){// 逐个遍历比对for(inti=0;i<arr.size();i++){if(arr[i]==key){returni;// 查找成功,返回下标}}return-1;// 查找失败}intmain(){// 无序数组测试vector<int>arr={3,1,7,5,2,4,9,6};cout<<"原数组:";for(intnum:arr)cout<<num<<" ";cout<<endl;inttarget=7;intpos=seqSearch(arr,target);if(pos!=-1)cout<<"顺序查找:元素"<<target<<" 找到,下标为:"<<pos<<endl;elsecout<<"顺序查找:元素"<<target<<" 未找到"<<endl;return0;}

2、折半查找

先确定待查记录所在的范围(区间),然后逐步缩小范围知道找到或者找不到该记录为止。

#include<iostream>#include<vector>usingnamespacestd;// 折半查找(二分查找):仅适用于升序有序数组intbinSearch(vector<int>&arr,intkey){intleft=0;intright=arr.size()-1;while(left<=right){intmid=(left+right)/2;if(arr[mid]==key){returnmid;// 找到目标,返回下标}elseif(arr[mid]>key){right=mid-1;// 目标在左区间}else{left=mid+1;// 目标在右区间}}return-1;// 查找失败}intmain(){// 必须使用有序数组vector<int>arr={1,2,3,4,5,6,7,9};cout<<"有序数组:";for(intnum:arr)cout<<num<<" ";cout<<endl;inttarget=6;intpos=binSearch(arr,target);if(pos!=-1)cout<<"折半查找:元素"<<target<<" 找到,下标为:"<<pos<<endl;elsecout<<"折半查找:元素"<<target<<" 未找到"<<endl;return0;}

3、分块查找

将无序的原始数据表,按规则分成若干块(块内无序、块间有序);同时建立一张索引表,记录每块的最大值与块起始地址。查找时先查索引确定目标所在块,再到对应块内顺序查找。

#include<iostream>#include<vector>usingnamespacestd;// 索引表结构体:记录每块最大值、块起始下标structIndex{intmaxVal;intstart;};// 分块查找intblockSearch(vector<int>&arr,vector<Index>&indexTable,intkey){// 1、索引表查找:确定目标所在块intblockNum=indexTable.size();intfindBlock=-1;for(inti=0;i<blockNum;i++){if(key<=indexTable[i].maxVal){findBlock=i;break;}}if(findBlock==-1)return-1;// 2、块内顺序查找intstart=indexTable[findBlock].start;// 确定当前块结束下标intend;if(findBlock==blockNum-1)end=arr.size()-1;elseend=indexTable[findBlock+1].start-1;for(inti=start;i<=end;i++){if(arr[i]==key)returni;}return-1;}intmain(){// 数据:块间有序、块内无序// 第0块:{3,1,2} 最大值3// 第1块:{5,4,6} 最大值6// 第2块:{9,7} 最大值9vector<int>arr={3,1,2,5,4,6,9,7};// 构建索引表vector<Index>indexTable={{3,0},{6,3},{9,6}};cout<<"分块存储数组:";for(intnum:arr)cout<<num<<" ";cout<<endl;inttarget=4;intpos=blockSearch(arr,indexTable,target);if(pos!=-1)cout<<"分块查找:元素"<<target<<" 找到,下标为:"<<pos<<endl;elsecout<<"分块查找:元素"<<target<<" 未找到"<<endl;return0;}
http://www.cnnetsun.cn/news/3607956.html

相关文章:

  • 嵌入式EMIF寄存器配置实战:从时序计算到SDRAM与NOR Flash驱动
  • AI-Native 云原生架构实战:从 Kubernetes 容器编排到 AI Agent 智能体编排
  • 2026 年企业体系认证咨询服务深度评测与选型指南
  • OpenWrt/LEDE软路由AP模式配置实战:无缝融入现有网络
  • 《Claude Code工程化实践》加课5 -Context Engineering :给模型正确的上下文,而不是更多的上下文
  • 【CTF-MISC-压缩包】脚本实现批量提取压缩包数据
  • GEO优化别买排名神话:广拓时代谈AI搜索真正优化什么
  • 【CTF-MISC-流量】从HTTP流中,根据图片头标识,提取图片,放到CyberChef中解析
  • 深入解析C2000 ePWM寄存器:从原理到电机控制与数字电源实战
  • HarmonyOS应用实战-启示散页-19-空态不是一句暂无数据:给题库、收藏和历史分别设计可恢复入口
  • 技术海报/博文封面没质感?5款艺术字体+配色排版实战技巧!职场人导航还有更多惊喜!
  • C语言-字符函数和字符串函数
  • 园区除雪设备分类
  • 嵌入式系统硬件CRC控制器:原理、模式与应用实战
  • RSA非对称加密在软件授权验证中的原理与应用:以Beyond Compare为例
  • 【单片机毕业设计推荐】 基于 STM32 的智能恒温除湿消毒柜控制系统设计与实现,基于 STM32 的物联网智能柜体环境监测与调控系统设计(013003)
  • 文献综述写不下去?通义千问智能降维技巧来了,1小时生成逻辑闭环框架,导师当场点赞
  • 从零接触FastAPI框架,今日学习day04
  • mmdetection3D与NuScenes数据集实战指南
  • 易拉罐正反面识别数据集下载,支持yolo,coco json,pasical voc xml格式的标注信息,平均正确识别率为99.5%,训练集2373张图片
  • Profinet--TIAPortal V19安装与项目实战指南
  • 智能查重工具革新:从算法原理到论文降重实战
  • Llama2架构解析与工程实践优化指南
  • verilog HDLBits刷题[Counters]“Exams/ece241 ”---Counter 1000
  • 法律AI智能体架构设计与性能调优实战
  • ping和traceroute
  • 软考全科目学习资料完全免费分享
  • Cortex-M4 FPU硬件浮点单元:原理、配置与嵌入式实时系统优化实践
  • TM4C129XNCZAD实战:PWM、QEI与ADC模块协同构建高精度电机控制系统
  • 电池电量计核心术语解析:从SOC到Qmax,构建精准电池管理知识体系