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并发…...
浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)
✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义(Task Definition&…...
大型活动交通拥堵治理的视觉算法应用
大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动(如演唱会、马拉松赛事、高考中考等)期间,城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例,暖城商圈曾因观众集中离场导致周边…...
STM32标准库-DMA直接存储器存取
文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA(Direct Memory Access)直接存储器存取 DMA可以提供外设…...
linux 错误码总结
1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...
土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等
🔍 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术,可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势,还能有效评价重大生态工程…...
Java求职者面试指南:计算机基础与源码原理深度解析
Java求职者面试指南:计算机基础与源码原理深度解析 第一轮提问:基础概念问题 1. 请解释什么是进程和线程的区别? 面试官:进程是程序的一次执行过程,是系统进行资源分配和调度的基本单位;而线程是进程中的…...
【JavaSE】多线程基础学习笔记
多线程基础 -线程相关概念 程序(Program) 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序,比如我们使用QQ,就启动了一个进程,操作系统就会为该进程分配内存…...
Razor编程中@Html的方法使用大全
文章目录 1. 基础HTML辅助方法1.1 Html.ActionLink()1.2 Html.RouteLink()1.3 Html.Display() / Html.DisplayFor()1.4 Html.Editor() / Html.EditorFor()1.5 Html.Label() / Html.LabelFor()1.6 Html.TextBox() / Html.TextBoxFor() 2. 表单相关辅助方法2.1 Html.BeginForm() …...
FFmpeg:Windows系统小白安装及其使用
一、安装 1.访问官网 Download FFmpeg 2.点击版本目录 3.选择版本点击安装 注意这里选择的是【release buids】,注意左上角标题 例如我安装在目录 F:\FFmpeg 4.解压 5.添加环境变量 把你解压后的bin目录(即exe所在文件夹)加入系统变量…...
MyBatis中关于缓存的理解
MyBatis缓存 MyBatis系统当中默认定义两级缓存:一级缓存、二级缓存 默认情况下,只有一级缓存开启(sqlSession级别的缓存)二级缓存需要手动开启配置,需要局域namespace级别的缓存 一级缓存(本地缓存&#…...
