C语言——数组和排序
C语言——数组和排序
- 数组
- 数组的概念
- 数组的初始化
- 数组的特点
- 排序
- 选择排序
- 冒泡排序
- 插入排序
- 二分查找
数组
数组的概念
数组是一组数据 ;
数组是一组相同类型的数据或变量的集合 ;
应用场景:
用于批量的处理多个数据 ;
语法:
类型说明符 数组名 [常量表达式]
类型说明符也就是数组中元素的数据类型,元素的数据类型可以是整型(int/short/long/long long)、字符型(char)、浮点型(float / double /long double );
数组名代表的是整个数组也表示的是数组首元素的地址,数组名的命名规则和普通变量的命名规则一致;
**[常量表达式]**其中的常量表达式代表的是数组的长度,数组长度可以省略,但是必须要有初始化编译器要根据初始化的值,来推算实际的长度。需要注意的是:c99标准之后,数组长度可以是变量但是不能初始化。
数组的初始化
数组的初始化可以分为三种:
1、全部初始化:int a[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
2、部分初始化:int a[10] = { 1, 2, 3, 4, 5 };
特点:没有被初始化的部分会被初始化为0;
3、不初始化:int a[10];
特点:不初始化数组中的值全部是随机值;
数组的特点
1、连续性, 即数组空间是一片连续内存空间 ;
2、有序性,即数组的元素挨个存放 ;
3、单一性,即数组元素类型是同一类型 ;
数组下标的含义:
a[0],下标表示的是相对于数组名也就是数组首元素偏移了几个元素。
排序
选择排序
选择排序的主要思想就是给数选择合适的位置;
实现代码如下:
#include <stdio.h>int main(void)
{int i = 0, j = 0, size = 0, temp = 0;scanf("%d", &size);int a[size];for (i = 0; i < size; ++i){scanf("%d", &a[i]);}for (i = 0; i < size-1; ++i){for (j = i+1; j < size; ++j){if(a[j] < a[i]){temp = a[i];a[i] = a[j];a[j] = temp;}}}for(i = 0; i < size; ++i){printf("%d ", a[i]);}printf("\n");return 0;
}
按照我的理解选择排序按照顺序选择一个数然后一次与数组后面的数进行比较假设要排升序,如果被选择的数在比较的过程中小于其他的数就交换这两个数,举个例子来说假设有一个数组a[5] = { 5, 2, 0, 9, 8 };第一次也就是i = 0时,拿5和2(a[j]其中j==1)比较,2 < 5,交换2和5的在数组中的位置,此时a[i]就为2,然后2再和0进行比较(也就是让j++),0 < 2,交换这两个元素,此时a[i] == 0,再拿0和9(j++)比较,9 > 0不交换,再拿8和0比较(j++),8 > 0不交换此时到达数组末尾数组中首元素就是最小值然后让i++也就是拿第二个元素和它后面的元素进行比较,以此类推直到倒数第二个元素和倒数第一个元素比较一次后结束循环,此时数组中的元素就是升序的了。
冒泡排序
冒泡排序的主要思想是:一次冒出一个数相邻两个元素进行两两比较,小的放前,大的放后。
实现冒泡排序的核心代码:
for (i = 0; i < n-1; ++i)
{for (j = i + 1; j < n; ++j){if (a[j] < a[i]){int t = a[i];a[i] = a[j];a[j] = t;}}
}
我的理解是冒泡排序就是从第一个数开始让第一个数和第二个数进行比较大的放在后面小的放在前面,然后让第二个元素和第三个元素进行比较同理大的在后小的在前,直到倒数第二个元素和最后一个元素的比较完成后数组最后一个元素就是最大的元素,然后进行第二趟冒泡再进行第二趟冒泡时就不需要和最后一个元素a[n - 1]比较了因为最后一个元素已经是最大了,第二趟只需要比较前面n - 1个数(其中n为数组元素的个数),第二趟比较也是从a[0]开始和a[1]比较大在后小在前,a[1]和a[2]比较以此类推直到a[n - 2]和a[n - 3]比较这一趟冒泡过程结束,到第三趟冒泡确定第三大得数,直到n - 1趟冒泡结束整个冒泡排序;经过冒泡排序最后数组就就变得有序了。
插入排序
插入排序的主要思想是在有序序列中,找到合适的位置插入 。
实现插入排序的核心代码:
for (i = 1; i < n; ++i)
{int t = a[i];j = i;while(j > 0 && t < a[j-1]){a[j] = a[j-1];--j;}a[j] = t;
}
假设数组为 int a[5] = { 5, 2, 10, 3, 9};
其实插入排序跟我们平时, 排队差不多,假设我们要把数组元素按升序排列,组第一个元素我们认为它是有序的,我们用一个临时变量保存第二个元素然后拿这个临时变量temp和第一个元素比较如果第二个元素比第一个元素小那么第一个元素往后移动一个位置因为第一个元素前没有数据了所以把temp赋值给第一个元素,以上的例子就是temp = 2;2 小于 5,5往后移动四个字节把2覆盖掉,此时数组元素就是 5, 5, 10, 3, 9然后把temp赋值给a[0]此时数组元素就是2,5,10,3,9,然后拿第三个元素和前面的元素比较10大于5和2不用动,再拿第四个元素和前面的元素比较,3小于10,10往后移动,把3赋值给未移动前10的位置,3再和5比较3小于5,5往后移动把3赋给5移动前的位置,3再和2比较3大于2结束比较,最后的9和前面元素的比较的过程也是一样的如果比前一个元素小,前一个元素就往后移动直到大于前一个元素或者到数组首元素为止。
二分查找
二分查找的前提是数组元素有序,输入要查找的元素,设置中心坐标,用中心坐标元素和要查找的元素比较如果要查找的元素大就往右找即begin = mid + 1;再更新坐标再继续找,如果要查找的元素小就往左找end = mid - 1;再比较直到找到为止。
#include <stdio.h>int main(void)
{int a[9] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };int begin = 0;int key = 0;int end = sizeof(a) / sizeof(a[0]);scanf("%d", &key);while(begin <= end){int mid = (begin + end) / 2;if(a[mid] > key){end = mid - 1;}else if(a[mid] < key){begin = mid + 1;}else{break;}}if(begin <= end){printf("找到了\n");}else{printf("没找到\n");}return 0;
}
相关文章:
C语言——数组和排序
C语言——数组和排序 数组数组的概念数组的初始化数组的特点 排序选择排序冒泡排序插入排序 二分查找 数组 数组的概念 数组是一组数据 ; 数组是一组相同类型的数据或变量的集合 ; 应用场景: 用于批量的处理多个数据 ; 语法&…...
QEMU 新增QMPHMP指令【原文阅读】
文章目录 0x0 QEMU原文0x10x11 How to write monitor commands0x12 Overview0x13 Testing 0x20x21 Writing a simple command: hello-world0x22 Arguments 0x30x31 Implementing the HMP command 0x40x41 Writing more complex commands0x42 Modelling data in QAPI0x43 User D…...
【Linux】全志Tina配置屏幕时钟的方法
一、文件位置 V:\f1c100s\Evenurs\f1c100s\tina\device\config\chips\c200s\configs\F1C200s\sys_config.fex 二、文件内容 三、介绍 在此处可以修改屏幕的频率,当前为21MHz。 四、总结 注意选择对应的屏幕的参数,sdk所支持的屏幕信息都在此文件夹中…...
探索WebKit的CSS表格布局:打造灵活的网页数据展示
探索WebKit的CSS表格布局:打造灵活的网页数据展示 CSS表格布局是一种在网页上展示数据的强大方式,它允许开发者使用CSS来创建类似于传统HTML表格的布局。WebKit作为许多流行浏览器的渲染引擎,提供了对CSS表格布局的全面支持。本文将深入探讨…...
信号的运算
信号实现运算,首先要明确,电路此时为负反馈电路,当处于深度负反馈时,可直接使用虚短虚断。负反馈相关内容可见:放大电路中的反馈_基极反馈-CSDN博客https://blog.csdn.net/qq_63796876/article/details/140438759 一、…...
Vue3知识点汇总
创建项目 npm init vuelatest // npm create vitelatestVue文件结构 <!-- 开关:经过语法糖的封装,容许在script中书写组合式API --> <!-- setup在beforeCreate钩子之前自动执行 --> <script setup><!-- 不再要求唯一根元素 -->…...
C++设计模式--单例模式
单例模式的学习笔记 单例模式是为了:在整个系统生命周期内,保证一个类只能产生一个实例,确保该类的唯一性 参见链接1,链接2 #include <iostream> #include <mutex>using namespace std;/*懒汉模式:只有在…...
数据驱动未来:构建下一代湖仓一体电商数据分析平台,引领实时商业智能革命
1.1 项目背景 本项目是一个创新的湖仓一体实时电商数据分析平台,旨在为电商平台提供深度的数据洞察和业务分析。技术层面,项目涵盖了从基础架构搭建到大数据技术组件的集成,采用了湖仓一体的设计理念,实现了数据仓库与数据湖的有…...
学习JavaScript第五天
文章目录 1.HTML DOM1.1 表单相关元素① form 元素② 文本输入框类和文本域(input 和 textarea)③ select 元素 1.2 表格相关元素① table 元素② tableRow 元素(tr 元素)③ tableCell 元素 (td 或 th) 1.3…...
pythonGame-实现简单的坦克大战
通过python简单复现坦克大战游戏。 使用到的库函数: import turtle import math import random import time 游戏源码: import turtle import math import random import time# 设置屏幕 screen turtle.Screen() screen.setup(800, 600) screen.tit…...
不太常见的asmnet诊断
asm侦听 [griddb1-[ASM1]-/home/grid]$ srvctl config asm ASM home: <CRS home> Password file: OCR/orapwASM Backup of Password file: OCRDG/orapwASM_backup ASM listener: LISTENER ASM instance count: 3 Cluster ASM listener: ASMNET1LSNR_ASM[rootdb1:/root]# …...
双指针-【3,4,5,6,7,8】
第三题:快乐数 . - 力扣(LeetCode). - 备战技术面试?力扣提供海量技术面试资源,帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/happy-number/算法思想: 1.每个…...
react Vant中如何获取步进器的值
在React中使用Vant(一个轻量、可靠的移动端Vue组件库,虽然原生是为Vue设计的,但如果你在使用的是React版本的Vant,比如通过某些库或框架桥接Vue组件到React,或者是一个类似命名的React UI库),获…...
Windows下Git Bash乱码问题解决
Windows下Git Bash乱码问题解决 缘起 个人用的电脑是Mac OS,系统和终端编码都是UTF-8,但公司给配发的电脑是Windows,装上Git Bash在使用 git commit -m "中文"时会乱码 解决 确认有以下配置 # 输入 git config --global --lis…...
HTML5 + CSS3
HTML 基础 准备开发环境 1.vscode 使用 新建文件夹 ---> 左键拖入 vscode 中 2.安装插件 扩展 → 搜索插件 → 安装打开网页插件:open in browser汉化菜单插件:Chinese 3.缩放代码字号 放大,缩小:Ctrl 加号,减号 4.设…...
NFTScan | 07.22~07.28 NFT 市场热点汇总
欢迎来到由 NFT 基础设施 NFTScan 出品的 NFT 生态热点事件每周汇总。 周期:2024.07.22~ 2024.07.28 NFT Hot News 01/ 数据:NFT 系列 Liberty Cats 地板价突破 70000 MATIC 7 月 22 日,据 Magic Eden 数据,NFT 系列 Liberty C…...
探索分布式光伏运维系统的组成 需要几步呢?
前言 随着光伏发电的不断发展,对于光伏发电监控系统的需求也日益迫切,“互联网”时代,“互联网”的理念已经转化为科技生产的动力,促进了产业的升级发展,本文结合“互联网”技术提出了一种针对分散光伏发电站运行数据…...
做知识付费项目还能做吗?知识付费副业项目如何做?能挣多少钱?
hello,我是阿磊,一个20年的码农,6年前代码写不动了,转型专职做副业项目研究,为劳苦大众深度挖掘互联网副业项目,共同富裕。 现在做知识付费项目还能做吗? 互联网虚拟资源项目我一直在做,做了有…...
K210视觉识别模块学习笔记7:多线程多模型编程识别
今日开始学习K210视觉识别模块: 图形化操作函数 亚博智能 K210视觉识别模块...... 固件库: canmv_yahboom_v2.1.1.bin 训练网站: 嘉楠开发者社区 今日学习使用多线程、多模型来识别各种物体 这里先提前说一下本文这次测试实验的结果吧:结果是不太成…...
【OSG学习笔记】Day 18: 碰撞检测与物理交互
物理引擎(Physics Engine) 物理引擎 是一种通过计算机模拟物理规律(如力学、碰撞、重力、流体动力学等)的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互,广泛应用于 游戏开发、动画制作、虚…...
相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了: 这一篇我们开始讲: 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下: 一、场景操作步骤 操作步…...
基于Uniapp开发HarmonyOS 5.0旅游应用技术实践
一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架,支持"一次开发,多端部署",可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务,为旅游应用带来…...
【项目实战】通过多模态+LangGraph实现PPT生成助手
PPT自动生成系统 基于LangGraph的PPT自动生成系统,可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析:自动解析Markdown文档结构PPT模板分析:分析PPT模板的布局和风格智能布局决策:匹配内容与合适的PPT布局自动…...
使用 SymPy 进行向量和矩阵的高级操作
在科学计算和工程领域,向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能,能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作,并通过具体…...
Typeerror: cannot read properties of undefined (reading ‘XXX‘)
最近需要在离线机器上运行软件,所以得把软件用docker打包起来,大部分功能都没问题,出了一个奇怪的事情。同样的代码,在本机上用vscode可以运行起来,但是打包之后在docker里出现了问题。使用的是dialog组件,…...
算法岗面试经验分享-大模型篇
文章目录 A 基础语言模型A.1 TransformerA.2 Bert B 大语言模型结构B.1 GPTB.2 LLamaB.3 ChatGLMB.4 Qwen C 大语言模型微调C.1 Fine-tuningC.2 Adapter-tuningC.3 Prefix-tuningC.4 P-tuningC.5 LoRA A 基础语言模型 A.1 Transformer (1)资源 论文&a…...
基于TurtleBot3在Gazebo地图实现机器人远程控制
1. TurtleBot3环境配置 # 下载TurtleBot3核心包 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone -b noetic-devel https://github.com/ROBOTIS-GIT/turtlebot3.git git clone -b noetic https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git git clone -b noetic-dev…...
Java数值运算常见陷阱与规避方法
整数除法中的舍入问题 问题现象 当开发者预期进行浮点除法却误用整数除法时,会出现小数部分被截断的情况。典型错误模式如下: void process(int value) {double half = value / 2; // 整数除法导致截断// 使用half变量 }此时...
yaml读取写入常见错误 (‘cannot represent an object‘, 117)
错误一:yaml.representer.RepresenterError: (‘cannot represent an object’, 117) 出现这个问题一直没找到原因,后面把yaml.safe_dump直接替换成yaml.dump,确实能保存,但出现乱码: 放弃yaml.dump,又切…...
