排序(一)----冒泡排序,插入排序
前言
今天讲一些简单的排序,冒泡排序和插入排序,但是这两个排序时间复杂度较大,只是起到一定的学习作用,只需要了解并会使用就行,本文章是以升序为例子来介绍的
一冒泡排序
思路
冒泡排序是一种简单的排序算法,它重复地遍历要排序的序列,每次比较相邻的两个元素,如果顺序错误则交换它们。这样每一轮遍历过后,序列中最大的元素就会被移动到最后的位置上,直至整个序列有序。
具体步骤如下:
1. 从序列的第一个元素开始,比较相邻的两个元素,如果顺序错误则交换它们;
2. 继续遍历序列,每次比较相邻的两个元素并交换,直至遍历完整个序列;
3. 重复以上步骤,除去已排序的元素,直至整个序列有序
屏幕录制 2024-05-14 213653-CSDN直播
具体实现
这里建议排序可以写一次的运动在推测总体的代码,下面第一次写代码,下面的n 是数组具体个数,但是第一个代码和第二个代码是一样的情况,都可以实现这个排序
为什么会不一样呢?
- 因为下面的索引 i 的不同,第一个是i和i+1,那么假设有4个数的话,从0下标开始比较3次,i<n-1 满足了条件三次循环的条件,并从下标0开始比较
- 因为下面的索引 i 的不同,第二个是i和i-1,那么假设有4个数的话,从0下标开始比较3次,i<n 满足了条件三次循环的条件,并从下标1开始比较
for (int i = 0; i < n-1; i++) {if (a[i] > a[i + 1]) {Swap(&a[i], &a[i + 1]);}}for (int i = 1; i < n ; i++) {if (a[i - 1] > a[i]) {Swap(&a[i], &a[i-1]);}}
实现了一次的代码之后就可以套用整个代码的逻辑去完善代码,总共n个数,那么比较n-1次就行了
为什么?因为每一次比较两个数,例如比较3个数,那么就是
- 第一个和第二个数
- 第二个数和第三个数比较
void BubbleSort(int* a, int n) {for (int j = 0; j < n; j++) {//运行n-1次for (int i = 0; i < n-j-1; i++) {if (a[i] > a[i + 1]) {Swap(&a[i], &a[i + 1]);}}}
}
然后下面是结果,是这上面的动态图片是一致的,可以和上面的图片一起配合理解
总结
冒泡排序的时间复杂度为O(n^2),其中n为序列的长度。虽然它比较简单,但由于其效率较低,在实际应用中往往不被推荐使用。
二插入排序
思路
插入排序是一种简单直观的排序算法。它的基本思想是将待排序的元素依次插入已排好序的序列中,直到全部元素都插入完成。
具体操作如下:
1. 将待排序的元素分成已排序和未排序的两部分。初始时已排序部分只包含第一个元素,未排序部分包含剩下的元素。
2. 从未排序部分取出第一个元素,与已排序部分的元素逐个比较。如果当前元素小于已排序部分的某个元素,则将该元素插入到该位置,同时将该位置之后的元素都后移一位。
3. 重复步骤2,直到未排序部分为空,即所有元素都已插入到已排序部分。
屏幕录制 2024-05-14 223809-CSDN直播
具体实现
还是和刚才一样,先实现一次代码的运行来完善整个代码,具体的思路是先插入数字,每一次插入数字要前最后一个数字比较
- 如果比他大的话符合题目条件,就跳出循环
- 如果更小的话,就将和插入数字比较的数字往后移动来留出空位最后给他插入,
比如1,2插入一个0的话,与2比较2往后移,是一次循环,接着end--进入下一循环,比一小就将1往后移,插入数字就移动到1的前面,变成0,1,2
int end = i;
int tem = a[end + 1];
while (end >= 0)
{if (tem < a[end]) {a[end + 1] = a[end];//往后移动,留出空位end--;}elsebreak;
}
a[end+1] = tem;//把前面的空位填满
那么就把它补充一下变成完整的代码,由一趟看出是不断插入的,每一次比较两个数0比较1 0
i=1比较1 2,所以只要到n-1就行,如果i<n的话end+1溢出,所以下面是n-1
void InsertSort(int*a, int n) {//0 endfor (int i = 0; i < n-1; i++) int end = i;int tem = a[end + 1];while (end >= 0){if (tem < a[end]) {a[end + 1] = a[end];//留出空位end--;}elsebreak;}a[end+1] = tem;//把前面的空位填满}}
总结
插入排序的时间复杂度为O(n^2),其中n为待排序元素的个数。最好情况下,如果待排序的序列已经是有序的,插入排序的时间复杂度为O(n)。插入排序是一种稳定的排序算法,它不会改变相等元素的相对顺序。
学习思考
学习了冒泡排序和选择排序虽然他们的时间复杂度是o^2,但是选择排序更优一点,具体的可以通过
下面是用了一个函数clock的它的作用是记录时间,单位是毫秒,可以计算相同情况下这个代码运行的时间差异,来比较代码的优劣
int begin7 = clock(); BubbleSort(a7, N);int end7 = clock(); int begin1 = clock();InsertSort(a1, N);int end1 = clock();
因为冒泡排序只是全是有序的才会只执行一次内层循环
选择排序只要插入数字比中间数字小的话,就会跳出循环,与之相比跳出循环的可能性更高
所以代码光看时间复杂度是不行的要结合具体情况分析!!
相关文章:

排序(一)----冒泡排序,插入排序
前言 今天讲一些简单的排序,冒泡排序和插入排序,但是这两个排序时间复杂度较大,只是起到一定的学习作用,只需要了解并会使用就行,本文章是以升序为例子来介绍的 一冒泡排序 思路 冒泡排序是一种简单的排序算法,它重复地遍历要排序的序列,每次比较相邻…...

springcloud简单了解及上手
springcloud微服务框架简单上手 文章目录 springcloud微服务框架简单上手一、SpringCloud简单介绍1.1 单体架构1.2 分布式架构1.3 微服务 二、SpringCloud与SpringBoot的版本对应关系2022.x 分支2021.x 分支2.2.x 分支 三、Nacos注册中心3.1 认识和安装Nacos3.2 配置Nacos3.3 n…...
Halcon与深度学习框架结合进行图像分析
Halcon 是一款强大的机器视觉软件,而深度学习框架如 TensorFlow 或 PyTorch 在图像识别和分类任务中表现出色。结合两者的优势,可以实现复杂的图像分析任务。Halcon 负责图像预处理和特征提取,而深度学习框架则利用这些特征进行高级分析和识别…...

STL----push,insert,empalce
push_back和emplace_back的区别 #include <iostream> #include <vector>using namespace std; class testDemo { public:testDemo(int n) :num(n) {cout << "构造函数" << endl;}testDemo(const testDemo& other) :num(other.num) {cou…...

解决OpenHarmony设备开发Device Tools工具的QUICK ACCESS一直为空
今天重新安装了OpenHarmony设备开发的环境,在安装过程中,到了工程之后,QUICK ACCESS一直为空。如下图红色大方框的内容一开始没有。 解决方案: 在此记录我的原因,我的原因主要是deveco device tools的远程连接的是z…...
k8s拉起一个pod底层是如何运行的
在Kubernetes中,当你尝试启动一个Pod时,底层的运行方式是由Kubelet服务来管理的。以下是Pod启动过程的简化概述: Kubernetes API Server接收到创建Pod的请求。 API Server将Pod的元数据存储到etcd中,以便于Pod的调度和跟踪。 Sc…...

Java代理模式的实现详解
一、前言 1.1、说明 本文章是在学习mybatis框架源码的过程中,发现对于动态代理Mapper接口这一块的代理实现还是有些遗忘和陌生,因此在本文章中就Java实现代理模式的过程进行一个学习和总结。 1.2、参考文章 《设计模式》(第2版࿰…...

数据结构与算法===优先队列
文章目录 前言一、优先队列二、应用场景三、代码实现总结 前言 之前写过很多数据结构与算法相关的了,今天看一个新的数据结构,优先队列。优先队列类似队列,却又优先于队列,是堆实现的。接下来详细看看。 一、优先队列 优先队列一…...

HTML常用标签-超链接标签
超链接标签 点击后带有链接跳转的标签 ,也叫作a标签 href属性用于定义连接 href中可以使用绝对路径,以/开头,始终以一个固定路径作为基准路径作为出发点href中也可以使用相对路径,不以/开头,以当前文件所在路径为出发点href中也可以定义完整的URL target用于定义打开的方式 _b…...

财务管理|基于SprinBoot+vue的财务管理系统(源码+数据库+文档)
财务管理系统 目录 基于SprinBootvue的财务管理系统 一、前言 二、系统设计 三、系统功能设计 系统功能实现 1管理员功能模块 2员工功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取: 博主介绍࿱…...

快速学习SpringAi
Spring AI是AI工程师的一个应用框架,它提供了一个友好的API和开发AI应用的抽象,旨在简化AI应用的开发工序,例如开发一款基于ChatGPT的对话应用程序。通过使用Spring Ai使我们更简单直接使用chatgpt 1.创建项目 jdk17 引入依赖 2.依赖配置 …...

谈谈 Spring 的过滤器和拦截器
前言 我们在进行 Web 应用开发时,时常需要对请求进行拦截或处理,故 Spring 为我们提供了过滤器和拦截器来应对这种情况。那么两者之间有什么不同呢?本文将详细讲解两者的区别和对应的使用场景。 (本文的代码实现首先是基于 Sprin…...
请介绍下H264的多参考帧技术及其应用场景,并请说明下为什么要有多参考帧?
H.264(也称为H.264/AVC)的多参考帧机制是其编码效率和质量提升的关键部分。这个机制允许编码器在编码当前帧时,参考多个之前已编码的帧。这种多参考帧的方法为编码器提供了更多的选择,使其能够更准确地预测当前帧的内容࿰…...
第6章 Elasticsearch,分布式搜索引擎【仿牛客网社区论坛项目】
第6章 Elasticsearch,分布式搜索引擎【仿牛客网社区论坛项目】 前言推荐项目总结第6章 Elasticsearch,分布式搜索引擎1.Elasticsearch入门2.Spring整合ElasticsearchDiscussPostRepositoryDiscussPostControllerEventConsumer 3.开发社区搜索功能 最后 前…...
odoo 全局调整list_controller中默认方法(form_controller和kanban_controller等亦可以同样操作)
需求说明 工作中遇到需要调整odoo原生的tree hearder button显示逻辑,又不可以直接跳转odoo源码,故新加个js全局替换对应的方法,以实现对应功能的同时不影响后期odoo版本升级。 odoo 全局调整list_controller方法示例 创建一个js放到stati…...
大模型日报2024-05-13
大模型日报 2024-05-13 大模型资讯 谷歌推出Gemini生成式AI平台 摘要: 生成式人工智能正在改变我们与技术的互动方式。谷歌最近推出了名为Gemini的新平台,该平台代表了其在生成式AI领域的最新进展。Gemini平台集成了一系列先进的工具和功能,旨在为用户提…...
【使用Condition来模拟生产消费】
使用Condition来模拟生产消费 1. 关于ReentrantLock 和condition的认知?2.使用condition实现生产者-消费者1. 关于ReentrantLock 和condition的认知? /*Q: ReentrantLock是如何实现管理锁和线程的?A: ReentrantLock是并发包中 一个类,它实现了Lock接口,提供了比内置synch…...
5.14学习总结
java聊天室项目 分片上传 将大文件切分为多个小的数据块(通常大小为1MB~10MB),然后将这些小数据块分别上传至服务器,最后由服务器将这些小块组合成完整的文件。这种方式可以避免由于网络中断或超时而导致上传失败,并…...

最新极空间部署iCloudpd教程,实现自动同步iCloud照片到NAS硬盘
【iPhone福利】最新极空间部署iCloudpd教程,实现自动同步iCloud照片到NAS硬盘 哈喽小伙伴们好,我是Stark-C~ 我记得我前年的时候发过一篇群晖使用Docker部署iCloudpd容器来实现自动同步iCloud照片的教程,当时热度还很高,可见大家…...

Sketch总结
sketch禁用了lineGap https://www.sketch.com/docs/designing/text/ http://www.sketchcn.com/sketch-chinese-user-manual.html https://github.com/sketch-hq/sketch-document https://developer.sketch.com/file-format/ https://animaapp.github.io/sketch-web-viewer/ htt…...

css实现圆环展示百分比,根据值动态展示所占比例
代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...

1.3 VSCode安装与环境配置
进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件,然后打开终端,进入下载文件夹,键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...

MySQL 8.0 OCP 英文题库解析(十三)
Oracle 为庆祝 MySQL 30 周年,截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始,将英文题库免费公布出来,并进行解析,帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...

安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)
船舶制造装配管理现状:装配工作依赖人工经验,装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书,但在实际执行中,工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...

LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf
FTP 客服管理系统 实现kefu123登录,不允许匿名访问,kefu只能访问/data/kefu目录,不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…...

面向无人机海岸带生态系统监测的语义分割基准数据集
描述:海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而,目前该领域仍面临一个挑战,即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...

MySQL 知识小结(一)
一、my.cnf配置详解 我们知道安装MySQL有两种方式来安装咱们的MySQL数据库,分别是二进制安装编译数据库或者使用三方yum来进行安装,第三方yum的安装相对于二进制压缩包的安装更快捷,但是文件存放起来数据比较冗余,用二进制能够更好管理咱们M…...

2025年渗透测试面试题总结-腾讯[实习]科恩实验室-安全工程师(题目+回答)
安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。 目录 腾讯[实习]科恩实验室-安全工程师 一、网络与协议 1. TCP三次握手 2. SYN扫描原理 3. HTTPS证书机制 二…...
大模型真的像人一样“思考”和“理解”吗?
Yann LeCun 新研究的核心探讨:大语言模型(LLM)的“理解”和“思考”方式与人类认知的根本差异。 核心问题:大模型真的像人一样“思考”和“理解”吗? 人类的思考方式: 你的大脑是个超级整理师。面对海量信…...

前端异步编程全场景解读
前端异步编程是现代Web开发的核心,它解决了浏览器单线程执行带来的UI阻塞问题。以下从多个维度进行深度解析: 一、异步编程的核心概念 JavaScript的执行环境是单线程的,这意味着在同一时间只能执行一个任务。为了不阻塞主线程,J…...