news 2026/7/23 20:12:23

基础三⼤查找

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
基础三⼤查找

内查找和外查找:查找也有内查找和外查找之分。若整个查找过程都在内存中进⾏,则称之为内查找(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;}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/23 20:11:34

嵌入式EMIF寄存器配置实战:从时序计算到SDRAM与NOR Flash驱动

1. 项目概述与核心价值 在嵌入式系统开发中&#xff0c;处理器与外部存储器的通信是决定系统性能与稳定性的基石。无论是运行复杂算法的工业控制器&#xff0c;还是需要大容量数据缓存的通信设备&#xff0c;都离不开高效、可靠的外部存储器接口。 外部存储器接口&#xff08;…

作者头像 李华
网站建设 2026/7/23 20:03:27

2026 年企业体系认证咨询服务深度评测与选型指南

很多企业在准备承接大型项目或参与招投标时&#xff0c;往往会突然被甲方抛出一连串资质要求&#xff1a;ISO9001 质量管理体系有没有&#xff1f;CMMI 认证到了几级&#xff1f;这时候&#xff0c;不少管理者才意识到&#xff0c;平时觉得“虚头巴脑”的证书&#xff0c;关键时…

作者头像 李华
网站建设 2026/7/23 20:03:12

OpenWrt/LEDE软路由AP模式配置实战:无缝融入现有网络

1. 为什么要把软路由变成AP?聊聊我的真实需求 大家好,我是老张,一个在智能硬件和网络这块折腾了十多年的老玩家。今天想和大家聊聊一个非常具体,但又特别实用的场景:把一台刷了OpenWrt或LEDE的软路由,从“主路由”模式,切换成“AP模式”。 听起来有点技术?别怕,我保…

作者头像 李华
网站建设 2026/7/23 19:59:14

【CTF-MISC-压缩包】脚本实现批量提取压缩包数据

题目 2024年春秋杯网络安全联赛冬季赛 - MISC - 压力大&#xff0c;写个脚本吧 https://www.ichunqiu.com/battalion?t1&r78931 解题思路 打开文件 发现一个压缩包一个txt文件 txt里有一串密文 RkdGR0ZHRkdGR0ZHRkdGR0ZHRkdGR0ZHRkdGR0ZHRkdGR0ZHRkdGR0ZHRkdGR0ZH…

作者头像 李华