C++中的搜索算法实现
C++中的搜索算法实现
在编程中,搜索算法是解决各种问题的基础工具之一。C++作为一种功能强大的编程语言,提供了多种实现搜索算法的方式。本文将详细介绍两种常见的搜索算法:线性搜索和二分搜索,并通过代码示例展示它们的实现。
一、线性搜索
线性搜索是一种简单直观的搜索算法,它通过逐个检查数组中的每个元素来查找目标值。这种方法适用于未排序的数组,因为它不依赖于数组的任何特定顺序。
1. 线性搜索的实现
以下是线性搜索的C++代码实现:
#include <iostream>
using namespace std;int linearSearch(int arr[], int n, int target) {for (int i = 0; i < n; i++) {if (arr[i] == target) {return i; // 返回目标值的索引}}return -1; // 如果未找到目标值,返回-1
}int main() {int arr[] = {10, 20, 30, 40, 50};int target = 30;int n = sizeof(arr) / sizeof(arr[0]);int result = linearSearch(arr, n, target);if (result != -1) {cout << "Element found at index " << result << endl;} else {cout << "Element not found in the array." << endl;}return 0;
}
2. 线性搜索的特点
- 优点:实现简单,适用于未排序的数组。
- 缺点:效率较低,时间复杂度为O(n)。
二、二分搜索
二分搜索是一种高效的搜索算法,适用于已排序的数组。它通过不断将搜索范围缩小一半来查找目标值,从而大大提高了搜索效率。
1. 二分搜索的实现
以下是二分搜索的C++代码实现:
#include <iostream>
using namespace std;int binarySearch(int arr[], int n, int target) {int left = 0;int right = n - 1;while (left <= right) {int mid = left + (right - left) / 2;if (arr[mid] == target) {return mid; // 返回目标值的索引} else if (arr[mid] < target) {left = mid + 1;} else {right = mid - 1;}}return -1; // 如果未找到目标值,返回-1
}int main() {int arr[] = {10, 20, 30, 40, 50};int target = 30;int n = sizeof(arr) / sizeof(arr[0]);int result = binarySearch(arr, n, target);if (result != -1) {cout << "Element found at index " << result << endl;} else {cout << "Element not found in the array." << endl;}return 0;
}
2. 二分搜索的特点
- 优点:效率高,时间复杂度为O(log n)。
- 缺点:仅适用于已排序的数组。
三、总结
线性搜索和二分搜索是两种常见的搜索算法,它们各有优缺点。线性搜索适用于未排序的数组,实现简单;而二分搜索适用于已排序的数组,效率更高。在实际编程中,选择合适的搜索算法可以大大提高代码的性能和可读性。
希望本文对你有所帮助!如果你对搜索算法有更多问题,欢迎在评论区留言讨论。
相关文章:
C++中的搜索算法实现
C中的搜索算法实现 在编程中,搜索算法是解决各种问题的基础工具之一。C作为一种功能强大的编程语言,提供了多种实现搜索算法的方式。本文将详细介绍两种常见的搜索算法:线性搜索和二分搜索,并通过代码示例展示它们的实现。 一、…...
(二十三)Dart 中的 Mixins 使用教程
Dart 中的 Mixins 使用教程 Mixins 简介 Mixins 是 Dart 中一种强大的特性,中文意思是“混入”,它允许在类中混入其他功能,从而实现类似多继承的功能。与传统的继承不同,Mixins 提供了一种更加灵活的方式来组合类的功能…...
《午夜地铁的幽灵AP》
点击下面图片带您领略全新的嵌入式学习路线 🔥爆款热榜 88万阅读 1.6万收藏 文章目录 **第一章:末班车的二进制月光****第二章:ESP32的赛博墓志铭****第三章:都市传说与CRC校验****第四章:数字孪生的献祭仪式****终章…...
创作领域“<em >彩</em><em>票</em><em>导</em><em>师</em><em>带</em><em>玩</em><em>群
天光揉碎最后一块夜斑,露珠压弯草叶的脆响惊醒了沉睡的巷子。青灰雾霭中,老墙上的爬山虎在打哈欠,卷曲的藤须滴落隔夜的月光。sFsTU...
Spring Cloud Gateway中GatewayFilter Factories(网关过滤工厂)的详细介绍
文章目录 1、网关过滤工厂介绍2、 GatewayFilter 过滤器的基本配置3、 Spring Cloud Gateway 内置 GatewayFilter Factories3.1、AddRequestHeader GatewayFilter3.2、AddResponseHeader GatewayFilter3.3、AddRequestParameter GatewayFilter3.4、RewritePath GatewayFilter3.…...
微服务架构:构建可持续演进的微服务架构的原则与实践指南
引言:微服务的价值锚点 某物流公司微服务化后,订单履约周期从2小时缩短至15分钟,但技术债务却以每年200%的速度增长。这个案例揭示了一个关键认知:微服务架构的成败不在于技术实现,而在于是否建立有效的演进机制。…...
C++的四种类型转换
文章目录 const_cast:去掉常量类型的类型转换static_cast:提供编译器认为安全的类型转换(在编译阶段完成类型转换)reinterpret:类似c风格的强制类型转化dynamic_cast:主要用在继承结构里,可以支持RTTI类型识别的上下转换dynamic_cast<>…...
Python Cookbook-4.15 字典的一键多值
任务 需要一个字典,能够将每个键映射到多个值上。 解决方案 正常情况下,字典是一对一映射的,但要实现一对多映射也不难,换句话说,即一个键对应多个值。你有两个可选方案,但具体要看你怎么看待键的多个对…...
《Python实战进阶》No37: 强化学习入门加餐版3 之 Q-Learning算法可视化升级
连续第4篇文章写Q-Learning算法及可视化 Q-Learning强化学习算法在迷宫寻路中的应用 引言 强化学习是机器学习的一个重要分支,其核心理念是通过与环境的交互来学习最优策略。在上三篇文章中,《Python实战进阶》No37: 强化学习入门:Q-Learn…...
1.两数之和(Java)
1. 题目描述 LeetCode 1. 两数之和(Two Sum) 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那两个整数,并返回它们的索引。 示例 1: 输入:nums [2,7,11,15], target 9 …...
漏洞挖掘---灵当CRM客户管理系统getOrderList SQL注入漏洞
一、灵当CRM 灵当CRM是上海灵当信息科技有限公司旗下产品,适用于中小型企业。它功能丰富,涵盖销售、服务、财务等管理功能,具有性价比高、简洁易用、可定制、部署灵活等特点,能助力企业提升经营效益和客户满意度。 二、FOFA-Sear…...
Java高频面试之集合-20
hello啊,各位观众姥爷们!!!本baby今天来报道了!哈哈哈哈哈嗝🐶 面试官:讲讲 HashSet 的底层实现? HashSet 是 Java 集合框架中用于存储唯一元素的高效数据结构,其底层实…...
sort命令:排序
sort:默认首位排序 参数: -n:按整个数字排序 -r:降序 -u:去重 [rootrobin ~]# sort -n aa.txt #按数字排序(正序) [rootrobin ~]# sort -nr aa.txt #降序 [rootrobin ~]# sort -…...
Javaweb后端 AOP快速入门 AOP核心概念 AOP执行流程
AOP是对特定方法编程,把共用都用的方法提取出来,统一维护 AOP基础 AOP快速入门 对原始方法无影响 AOP核心概念 连接点,是原始方法,被控制范围内的原始方法 通知,AOP类里面写的公共的方法 切入点,实际被AO…...
deepseek ai 输入法
一、简介 使用java开发一个安卓输入法接入deepseek实现ai聊天,代码已开源。 二、视频演示 deepseek输入法_哔哩哔哩_bilibili 三、开源地址 https://github.com/deepseek/inputmethed 四、技术细节 CustomInputMethodService.java 输入法服务类 MainActivity.…...
Rust 所有权与引用
目录 Rust 所有权原则变量所有权变量作用范围深拷贝 Rust 的引用示例可变引用不可变引用可变引用和不可变引用不能同时存在悬垂引用 Rust 所有权原则 Rust 中每一个值都被一个变量所拥有,该变量被称为值的所有者一个值同时只能被一个变量所拥有,或者说一…...
探究 CSS 如何在HTML中工作
2025/3/28 向全栈工程师迈进! 一、CSS的作用 简单一句话——美化网页 <p>Lets use:<span>Cascading</span><span>Style</span><span>Sheets</span> </p> 对于如上代码来说,其显示效果如下࿱…...
Verilog中X态的危险:仿真漏掉的bug
由于Verilog中X态的微妙语义,RTL仿真可能PASS,而网表仿真却会fail。 目前进行的网表仿真越来越少,这个问题尤其严重,主要是网表仿真比RTL仿真慢得多,因此对整个回归测试而言成本效益不高。 上面的例子中,用…...
使用 uv 管理 Python 项目
介绍 首先, uv 工具是使用 rust 开发出来的, 速度要比传统的 pip, pipx 等一众包管理工具要快不少. 另外, 除了包管理之外, uv 还提供了脚手架的功能, 使用体验和前端开发使用过的 vue-cli 很相似, 可以帮助我们自动初始化项目, 创建好一个空的包含必要文件结构的文件夹. 此外…...
【操作系统】软中断vs硬中断
在操作系统中,中断(Interrupt) 是 CPU 响应外部事件的重要机制,分为 硬中断(Hardware Interrupt) 和 软中断(Software Interrupt)。它们的核心区别在于 触发方式 和 处理机制。 1. 硬…...
《C++11:通过thread类编写C++多线程程序》
关于多线程的概念与理解,可以先了解Linux下的底层线程。当对底层线程有了一定程度理解以后,再学习语言级别的多线程编程就轻而易举了。 【Linux】多线程 -> 从线程概念到线程控制 【Linux】多线程 -> 线程互斥与死锁 语言级别的…...
19-dfs-排列数字(基础)
题目 来源 842. 排列数字 - AcWing题库 思路 由于相对简单,是dfs的模板题,具体思路详见代码 代码 #include<bits/stdc.h> using namespace std; const int N10; int state[N],path[N];//是否使用过,当前位置 int n; void dfs(int …...
32.代码题
接着上集...... 派对:超时了,总该受到惩罚吧? 洛西:至于吗?就0.1秒! 晴/宇:十分应该。 洛西:我..................... 没办法,洛西只能按照要求去抓R了。 1.P1102 …...
nacos 3.x Java SDK 使用详解
Nacos 3.x Java SDK 使用详解 Nacos 3.x 是云原生服务治理的重要升级版本,其 Java SDK 在性能、协议和扩展性上均有显著优化。 一、环境要求与依赖配置 基础环境 JDK 版本:需使用 JDK 17(Nacos 3.x 已放弃对 JDK 8 的支持)。Spri…...
SPI-NRF24L01
模块介绍 NRF24L01是NORDIC公司生产的一款无线通信芯片,采用FSK调制,内部集成NORDIC自己的Enhanced Short Burst 协议,可以实现点对点或者1对6 的无线通信,通信速率最高可以达到2Mbps. NRF24L01采用SPI通信。 ①MOSI 主器件数据输出…...
python黑科技:无痛修改第三方库源码
需求不符合 很多时候,我们下载的 第三方库 是不会有需求不满足的情况,但也有极少的情况,第三方库 没有兼顾到需求,导致开发者无法实现相关功能。 如何通过一些操作将 第三方库 源码进行修改,是我们将要遇到的一个难点…...
一区严选!挑战5天一篇脂质体组学 DAY1-5
Day 1! 前期已经成功挑战了很多期NHANES啦!打算来试试孟德尔随机化领域~ 随着孟德尔随机化研究的普及,现在孟德尔发文的难度越来越高,简单的双样本想被接收更是难上加难,那么如何破除这个困境,这次我打算…...
【JavaScript】合体期功法——DOM(二)
目录 DOM事件监听案例关闭广告随机点名 事件监听版本事件类型 DOM 事件监听 事件:编程时系统内发生的动作或事情,例如用户在网页上单击一个按钮 事件监听:让程序检测是否产生事件,一旦事件触发,立即调用函数做出响应…...
23种设计模式中的中介者模式
定义了一个中介对象来封装一系列对象之间的交互。中介者使各对象直接不再显示地相互引用,从而使其松散耦合,且可以独立地改变它们之间的交互。 通过引入一个中介者对象,来协调和封装多个对象之间的交互,从而降低他们之间的耦合度。…...
量子计算:开启未来计算的新纪元
一、引言 在当今数字化时代,计算技术的飞速发展深刻地改变了我们的生活和工作方式。从传统的电子计算机到如今的高性能超级计算机,人类在计算能力上取得了巨大的进步。然而,随着科技的不断推进,我们面临着越来越多的复杂问题&…...
