C语言复习4:有关数组的基础常见算法
# 数组的常见算法
- 查找算法
1. 基本查找/顺序查找
2. 二分查找/折半查找
3. 插值查找
4. 分块查找
5. 哈希查找
6. 树表查找
7. 斐波那契查找
- 排序算法(顾名思义,就是把没有顺序的数据进行从小到大/从大到小排序)
1. 冒泡排序
2. 选择排序
## 基本查找/顺序查找
- 核心思路:就是从数组的0索引开始,依次往后查找
* 如果找到了,就会返回数据对应的索引
* 如果没找到,就会返回-1
#include<stdio.h>int order(int arr[], int len, int needFindNum) {for (int i = 0; i < len; i++){if (arr[i] == needFindNum){return i;}}return -1;}int main() {//1. 定义数组int arr[] = {11,22,33,44,55};int len = sizeof(arr) / sizeof(arr[0]);//2. 定义一个变量表示要查找的数据int num = 55;//3. main函数外定义一个方法进行顺序查找int index = order(arr,len,num);printf("%d\n", index);return 0;}
## 二分查找/折半查找
- 前提条件:数组里得数据必须是有序的
- 核心逻辑:每次排除一半的查找范围
- 默认刚开始min是索引为0的值,max是索引为最大的那个值
- 核心思路:
1. min和max表示当前要查找的范围
2. min是min和max中间的
3. 如果要查找的值在mid的左边,缩小范围时,min不变,max等于mid - 1
4. 如果要查找的值在mid的右边,缩小范围时,max不变,min等于mid + 1
* 如果找到了,就会返回数据对应的索引
* 如果没找到,就会返回-1
#include<stdio.h>int binarySearch(int arr[], int len, int needFindNum) {//1确定要查找的范围int min = 0;int max = len - 1;//注意min,max,mid都是指索引while (min <= max) {int mid = min + (max - min)/ 2;//确定中间位置if (arr[mid] < needFindNum){min = mid + 1;}else if (arr[mid] > needFindNum){max = mid - 1;}else {return mid;}}return -1;}int main() {//折半查找/二分查找int arr[] = {11,22,33,44,55};int len = sizeof(arr) / sizeof(arr[0]);int num = 33;int index = binarySearch(arr, len, num);printf("要查找的值所在索引为:%d\n",index);return 0;}
## 插值查找
- 要求:数据要有序,且数据分布尽可能得均匀分布一些
- 优势:满足要求,效率比二分查找快,否则反而会更慢。
- 和二分查找相比,mid尽可能得靠近要查找的数据,但是要求数据尽可能的分布均匀。
- 代码和二分查找无异,就是把mid = (min + max)/2; 替换成:
int mid = min + (needFindNum - arr[min]) / (arr[max] - arr[min]) * (max - min);
## 分块查找
- 分块的原则1:前一块中的最大数据,小于后一块中所有的数据(块内无序,快间有序)
- 分块的原则2:块数数量一般等于数字的个数开根号,比如:16个数字一般分为4块左右
- 核心思路:先确定要查找的元素在哪一块,然后块内挨个查找
* 面对无规律的数据,在进行分块时,确保每块数字无交集(哈希查找)
## 哈希查找
- 在分块查找的核心思路上,面对的是无规律的数据,在进行分块时,确保每块数字无交集
## 冒泡排序
- 核心逻辑:相邻的数据两两比较,小的放前面,大的放后面
- 核心思路:
1. 相邻的元素两两比较,大的放右边,小的放左边。(默认排成从小到大)
2. 第一轮比较完毕之后,最大值就已经确定,第二轮以此类推。
3. 如果数据中有n个数据,总共我们只要执行n-1轮的代码就可以了
#include<stdio.h>void bubbleSort(int arr[] , int len) {for (int j = 0; j < len - 1; j++){for (int i = 0; i < len - 1 - j; i++) {if (arr[i] > arr[i+1]){int temp = arr[i];arr[i] = arr[i + 1];arr[i + 1] = temp;}}}}int main() {int arr[] = {55,56,33,11,22};int len = sizeof(arr) / sizeof(arr[0]);bubbleSort(arr, len);//遍历排完序后的数组for (int i = 0; i < len; i++){printf("%d ",arr[i]);}return 0;}
## 选择排序
- 核心逻辑:从0索引开始,拿着每一个索引上的元素跟后面的元素依次比较,小的放前面,大的放后面,以此类推。
- 核心思想:
1. 从0索引开始,跟后面的元素进行一一比较
2. 小的放前面,大的放后面
3. 第一轮循环从0索引开始比较,结束后最小的数据已经确定
4. 第二轮……以此类推
#include<stdio.h>void selectSort(int arr[] ,int len) {for (int j = 0; j < len - 1; j++){for (int i = j + 1; i < len ;i++) {if (arr[j] > arr[i]){int temp = arr[j];arr[j] = arr[i];arr[i] = temp;}}}}int main() {int arr[] = { 55,56,33,11,22 };int len = sizeof(arr) / sizeof(arr[0]);selectSort(arr,len);//遍历排好序的数组for (int i = 0; i < len; i++){printf("%d ",arr[i]);}return 0;}
相关文章:
C语言复习4:有关数组的基础常见算法
# 数组的常见算法 - 查找算法 1. 基本查找/顺序查找 2. 二分查找/折半查找 3. 插值查找 4. 分块查找 5. 哈希查找 6. 树表查找 7. 斐波那契查找 - 排序算法(顾名思义,就是把没有顺序的…...
Ubuntu从零创建Hadoop集群
目录 前言 前提准备 1.设置网关和网段 2.查看虚拟机IP及检查网络 3.Ubuntu相关配置 镜像源配置 下载 vim编辑器 4.设置静态IP和SSH免密(可选) 设置静态IP SSH免密 5.JDK环境部署 6.Hadoop环境部署 7.配置 Hadoop 配置文件 HDFS集群规划 HDFS集群配置 1.配…...
GPIO概念
GPIO通用输入输出口 在芯片内部存在多个GPIO,每个GPIO用于管理多个芯片进行输入,输出工作 引脚电平 0v ~3.3v,部分引脚可容任5v 输出模式下可控制端口输出高低电平,可以驱动LED,控制蜂鸣器,模拟通信协议&a…...
Node.js, Bun, Deno 比较概述
以下是 Node.js、Bun 和 Deno 的对比分析 概览 对比维度Node.jsDenoBun首次发布200920202022创始人Ryan DahlRyan Dahl(Node.js 原作者)Jarred Sumner运行时引擎V8(Chrome)V8(Chrome)JavaScriptCore&#…...
C# 类库打包dll文件
目录 前言操作流程注意事项 前言 在C#中,有多种方式可以对代码进行加密,以保护源代码不被轻易查看或修改,这篇文章主要介绍将C# cs类文件加密为dll文件的方式进行保护。 操作流程 在 Visual Studio 中,选择“创建新项目”。 选…...
Linux中的UDP编程接口基本使用
UDP编程接口基本使用 本篇介绍 在前面网络基础部分已经介绍了网络的基本工作模式,有了这些理论基础之后,下面先从UDP编程开始从操作部分深入网络 在本篇中,主要考虑下面的内容: 创建并封装服务端:了解创建服务端的…...
RAG项目实战:金融问答系统
需求痛点 私有知识很多,如何让大模型只选择跟问题有关的知识进行参考呢? 需求分析 是否可以使用关键词匹配呢?以前的搜索主要使用关键词匹配,这个要求太高了,需要提前抽取准备好关键词,有点像以前SEO的工…...
大白话React第十一章React 相关的高级特性以及在实际项目中的应用优化
假设我们已经对 React 前端框架的性能和可扩展性评估有了一定了解,接下来的阶段可以深入学习 React 相关的高级特性以及在实际项目中的应用优化,以下是详细介绍及代码示例: 1. React 高级特性的深入学习 1.1 React 并发模式(Con…...
虚拟机Linux操作(持续更新ing)
虚拟机操作(持续更新ing) 虚拟机基本操作(Linux) # Linux # 立刻关机 poweroff # 立刻关机,可以选择数字或者具体时间 shutdown -h now # 立刻重启,可以选择数字或者具体时间 shutdown -r now # 立刻重启 reboot # cd 切换目录,下面用根目录举例 cd /…...
【开源-线程池(Thread Pool)项目对比】
一些实现**线程池(Thread Pool)**功能的开源项目的对比分析。 线程池功能的开源项目 项目名称语言优点缺点适用场景开源代码链接ThreadPoolC简单易用,代码简洁;适合快速原型开发。功能较为基础,不支持动态调整线程数…...
JMeter 实战项目脚本录制最佳实践(含 BadBoy 录制方式)
JMeter 实战项目脚本录制最佳实践(含 BadBoy 录制方式) 一、项目背景 在软件测试过程中,使用 JMeter 进行性能测试和功能测试是常见的操作。本实战项目将详细介绍如何使用 JMeter 自带工具以及 BadBoy 进行脚本录制,并完善脚本以…...
Jackson注解实战:@JsonInclude的妙用
在日常的Java开发中,我们经常需要将Java对象序列化为JSON格式,以便进行数据传输或存储。然而,有时候我们并不希望在JSON中包含某些空值或不必要的字段,这不仅会增加数据的冗余性,还可能对后续的处理造成困扰。Jackson库…...
CAN总线通信协议学习1——物理层
首先来看看CAN是怎么产生的:简单理解,CAN就是一种“拥有特别连接方式”的数据传输的总线,其有特定的一些规则。 (注:资料及图片来源于知乎博主TOMOCAT。) CAN总线的结构 查阅参考文献,OSI标准…...
Vim 常用快捷键大全:跳转、编辑、查找替换全解析
摘要: Vim 是一款非常强大的文本编辑器,许多程序员和系统管理员都离不开它。 本文详细介绍了 Vim 编辑器中的常用快捷键和命令,从基本模式、光标移动、编辑操作到查找替换,再到文件保存等常用操作,帮助你快速上手并提…...
【Python 数据结构 2.时间复杂度和空间复杂度】
Life is a journey —— 25.2.28 一、引例:穷举法 1.单层循环 所谓穷举法,就是我们通常所说的枚举,就是把所有情况都遍历了的意思。 例:给定n(n ≤ 1000)个元素ai,求其中奇数有多少个 判断一…...
【Qt QML】QML鼠标事件(MouseArea)
QML鼠标事件全面解析 一、MouseArea基础概念 在 QML 中,鼠标事件是处理用户与界面元素交互的重要部分。QML 提供了多种方式来处理鼠标事件,MouseArea 是 QML 中用于处理鼠标事件的核心元素,它可以覆盖在其他元素之上,捕获鼠标操作并触发相应的信号。 1、基本用法 import …...
LeetCode 202. 快乐数 java题解
https://leetcode.cn/problems/happy-number/description/ 哈希表 class Solution {public boolean isHappy(int n) {if(n1) return true;HashSet<Integer> setnew HashSet<>();while(n!1&&!(set.contains(n))){//没找到结果;没有重复出现过se…...
《认知·策略·跃迁:新能源汽车工程师的深度学习系统构建指南》
--- ## 前言:为什么传统学习法正在杀死你的竞争力? 在新能源汽车领域,我们正经历着每18个月知识体系更新迭代的指数级变革。当磷酸铁锂电池能量密度刚突破200Wh/kg时,固态电池已进入量产倒计时;当自动驾驶还在L2级徘…...
PHP环境安装达梦数据库驱动实操
PHP环境安装达梦数据库驱动实操 一、环境准备 达梦数据库安装 从达梦官网下载对应系统版本的DM8开发版或企业版,完成安装并确保数据库服务正常运行。安装后需记录数据库的安装路径(如Windows默认路径为D:\dmdbms,Linux为/dm/server࿰…...
Electron + Vite + React + TypeScript 跨平台开发实践指南
Electron Vite React TypeScript 跨平台开发全栈实践指南 开发环境的搭建(node.js,npm的安装)请参见我的文章 2025Q1 核心组件版本矩阵 组件版本关键改进特性Electron30.0.0原生ESM支持、V8引擎性能优化30%Vite6.0.0多核编译加速、SSR增强模式React21.0.0并发…...
立体匹配中的“性价比”之选:深入解读GWCNet的组相关思想与实时应用潜力
立体匹配中的“性价比”之选:深入解读GWCNet的组相关思想与实时应用潜力 在自动驾驶和机器人导航领域,立体视觉系统需要实时处理大量视觉数据,这对算法的计算效率提出了严苛要求。传统立体匹配算法往往面临一个两难选择:要么追求…...
毕业论文格式反复返工?paperxie 智能排版教你一键通过导师审核
paperxie-免费查重复率aigc检测/开题报告/毕业论文/智能排版/文献综述/AI PPThttps://www.paperxie.cn/format/typesettinghttps://www.paperxie.cn/format/typesetting 作为毕业季最耗时耗力的 “机械劳动”,论文格式调整往往比正文写作更磨人。字号、行距、页眉页…...
在数据分析和报告自动化场景中集成Taotoken调用大模型
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 在数据分析和报告自动化场景中集成Taotoken调用大模型 数据分析与报告生成是许多团队日常工作中的高频任务。传统流程中࿰…...
CANN/pypto填充操作API
pypto.pad 【免费下载链接】pypto PyPTO(发音: pai p-t-o):Parallel Tensor/Tile Operation编程范式。 项目地址: https://gitcode.com/cann/pypto 产品支持情况 产品是否支持Ascend 950PR/Ascend 950DT√Atlas A3 训练系列产品/Atla…...
图表数据提取神器:3个步骤让WebPlotDigitizer帮你从图片中“挖“出宝贵数据
图表数据提取神器:3个步骤让WebPlotDigitizer帮你从图片中"挖"出宝贵数据 【免费下载链接】WebPlotDigitizer Computer vision assisted tool to extract numerical data from plot images. 项目地址: https://gitcode.com/gh_mirrors/we/WebPlotDigiti…...
Unity UGUI三大Layout Group核心原理与工程实践
1. 为什么这三个Layout Group是Unity UI开发的“地基级”组件,而不是可有可无的装饰品?在Unity里做UI,很多人第一反应是拖控件、调锚点、手动改RectTransform——这就像盖房子不打地基,先砌墙再想承重。我带过十几期新人训练营&am…...
Adams 多体动力学:工业仿真的黄金标准与未来引擎
Adams(Automatic Dynamic Analysis of Mechanical Systems)是全球多体动力学仿真领域的标杆软件,由 MSC Software 公司开发(现隶属于 Hexagon 集团),凭借领先的虚拟样机技术,成为汽车、航空航天…...
龙芯LS2K PMON启动全解析:从内核到U盘识别的奥秘
【龙芯LS2K PMON终极干货】整机设备启动全景图:从 mainbus 开机到 U 盘识别全流程 一、整篇总纲(最强一句话) 内核启动 → 读 ioconf.c/cfdata 硬件族谱 → 从根总线 mainbus 开始遍历 → 逐级 attach 设备 → 启动 PCI → 扫描到 OTG 控制器 → 加载 dwc2 驱动 → 开启 U…...
DDD 中的代码组织:按技术层分 vs 按领域模块分,哪种才是正解?
前言 在实践领域驱动设计(DDD)时,你可能见过两种截然不同的代码组织方式:一种是传统的按技术层划分文件夹,另一种是按业务模块划分文件夹。两种写法的人都声称自己在做 DDD,那到底哪种更合理?本…...
量子虚时演化算法:原理、实现与应用
1. 量子虚时演化算法概述虚时演化(Imaginary-Time Evolution, ITE)是量子物理模拟中的核心数学工具,其核心思想是将时间变量t替换为虚数-iβ(β为实数)。这种变换将薛定谔方程中的幺正演化算符e^(-iHt)转化为非幺正的e…...
