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并发…...
UE5 学习系列(二)用户操作界面及介绍
这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…...
conda相比python好处
Conda 作为 Python 的环境和包管理工具,相比原生 Python 生态(如 pip 虚拟环境)有许多独特优势,尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处: 一、一站式环境管理:…...
零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?
一、核心优势:专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发,是一款收费低廉但功能全面的Windows NAS工具,主打“无学习成本部署” 。与其他NAS软件相比,其优势在于: 无需硬件改造:将任意W…...
大话软工笔记—需求分析概述
需求分析,就是要对需求调研收集到的资料信息逐个地进行拆分、研究,从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要,后续设计的依据主要来自于需求分析的成果,包括: 项目的目的…...
【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)
骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术,它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton):由层级结构的骨头组成,类似于人体骨骼蒙皮 (Mesh Skinning):将模型网格顶点绑定到骨骼上,使骨骼移动…...
Java多线程实现之Thread类深度解析
Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...
今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存
文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...
GitFlow 工作模式(详解)
今天再学项目的过程中遇到使用gitflow模式管理代码,因此进行学习并且发布关于gitflow的一些思考 Git与GitFlow模式 我们在写代码的时候通常会进行网上保存,无论是github还是gittee,都是一种基于git去保存代码的形式,这样保存代码…...
6️⃣Go 语言中的哈希、加密与序列化:通往区块链世界的钥匙
Go 语言中的哈希、加密与序列化:通往区块链世界的钥匙 一、前言:离区块链还有多远? 区块链听起来可能遥不可及,似乎是只有密码学专家和资深工程师才能涉足的领域。但事实上,构建一个区块链的核心并不复杂,尤其当你已经掌握了一门系统编程语言,比如 Go。 要真正理解区…...
如何通过git命令查看项目连接的仓库地址?
要通过 Git 命令查看项目连接的仓库地址,您可以使用以下几种方法: 1. 查看所有远程仓库地址 使用 git remote -v 命令,它会显示项目中配置的所有远程仓库及其对应的 URL: git remote -v输出示例: origin https://…...
