排序(一)----冒泡排序,插入排序

 前言

今天讲一些简单的排序,冒泡排序和插入排序,但是这两个排序时间复杂度较大,只是起到一定的学习作用,只需要了解并会使用就行,本文章是以升序为例子来介绍的

一冒泡排序

思路

冒泡排序是一种简单的排序算法,它重复地遍历要排序的序列,每次比较相邻的两个元素,如果顺序错误则交换它们。这样每一轮遍历过后,序列中最大的元素就会被移动到最后的位置上,直至整个序列有序。

具体步骤如下:
1. 从序列的第一个元素开始,比较相邻的两个元素,如果顺序错误则交换它们;
2. 继续遍历序列,每次比较相邻的两个元素并交换,直至遍历完整个序列;
3. 重复以上步骤,除去已排序的元素,直至整个序列有序

屏幕录制 2024-05-14 213653-CSDN直播

具体实现

这里建议排序可以写一次的运动在推测总体的代码,下面第一次写代码,下面的数组具体个数,但是第一个代码和第二个代码是一样的情况,都可以实现这个排序

为什么会不一样呢?

  • 因为下面的索引  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();

因为冒泡排序只是全是有序的才会只执行一次内层循环

选择排序只要插入数字比中间数字小的话,就会跳出循环,与之相比跳出循环的可能性更高

所以代码光看时间复杂度是不行的要结合具体情况分析!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/12437.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RocketMQ:broker配置说明

RocketMQ broker配置项的简要说明&#xff1a;serverSelectorThreads: 服务器选择器线程数&#xff0c;用于处理网络请求。brokerRole: 指定Broker的角色&#xff0c;如ASYNC_MASTER表示异步主节点。serverSocketRcvBufSize: 服务器套接字接收缓冲区大小。osPageCacheBusyTimeO…

C++面试问题精选 0513

1、有一个类包含static成员变量,并且这个类的构造函数中包含一个死循环,可以删除 main 函数吗? 在C++中,如果你有一个类包含static成员变量,并且这个类的构造函数中包含一个死循环(即无限循环),那么这通常不是一个好的设计选择,因为这会导致任何尝试创建该类实例的操…

Dato for Mac v5.2.11激活版:掌握时间,掌控生活

在忙碌的生活中&#xff0c;您是否常常觉得时间不够用&#xff1f;Dato for Mac&#xff0c;您的时间管理专家&#xff0c;助您轻松掌控每一天。清晰的日历视图、个性化的提醒功能&#xff0c;让您的日程安排井井有条。无论是工作还是生活&#xff0c;Dato for Mac都能成为您的…

linux命令行启动一个php进程, 如何监控 ,崩溃报警通知?

在Linux环境中&#xff0c;监控PHP进程并在其崩溃时发送通知可以通过多种方式实现&#xff0c;包括使用shell脚本结合监控工具和通知服务。下面我将提供一个简单的方案&#xff0c;使用systemd服务来管理PHP进程&#xff0c;并通过邮件发送崩溃通知。 第1步&#xff1a;创建一…

IT行业的人才培养与教育

你眼中的IT行业现状与未来趋势 随着技术的不断进步&#xff0c;IT行业已成为推动全球经济和社会发展的关键力量。从云计算、大数据、人工智能到物联网、5G通信和区块链&#xff0c;这些技术正在重塑我们的生活和工作方式。你眼中IT行业的现状及未来发展趋势是怎么样的&#xf…

AI图像生成-调整

一、两张图画风不相似 2、在两张图的共同输出口新添加一个空白正面提示词板块和条件合并板块 二、预处理插件&#xff08;提取人物姿态&#xff09; 1、新建节点-》ControlNet预处理器-》面部与姿态-》Openpose姿态预处理器 2、添加上传图片板块与预览图片板块 3、提取姿态 右…

vue下载文件,获取header头文件名乱码,下载文件名有下划线的解决

后台以数据流将文件返回&#xff0c;将文件名放在header头里&#xff0c;是中文名&#xff0c;有乱码&#xff0c;如图 访问网络使用的是axios&#xff0c;在 // 响应拦截器 service.interceptors.response.use((res) > {........ if (res.config.responseType blob) {//文…

【Linux取经路】进程通信之匿名管道

文章目录 一、进程间通信介绍1.1 进程间通信是什么&#xff1f;1.2 进程间通信的目的1.3 进程通信该如何实现 二、管道2.1 匿名管道2.1.1 站在文件描述符角度深入理解管道2.1.2 接口使用2.1.3 PIPE_BUFFER 和 Pipe capacity2.1.4 管道中的四种情况2.1.5 管道特征总结 2.2 匿名管…

只用了三天就入门了Vue3?

"真的我学Vue3&#xff0c;只是为了完成JAVA课设" 环境配置 使用Vue3要去先下载Node.js。 就像用Python离不开pip包管理器一样。 Node.js — Run JavaScript Everywhere (nodejs.org) 下完Node.js去学习怎么使用npm包管理器&#xff0c;放心你只需要学一些基础的…

【MARIE】嵌入式系统设计半期报告:MARIE模拟器的使用

1.模拟器介绍 1.1 体系结构 MARIE &#xff08;Machine Architecture that is Really Intuitive and Easy&#xff09; 是一种机器架构和汇编语言。发布者还为机器提供了一组用 Java 编写的模拟器程序。MARIE.js 是 MARIE 的 JavaScript 版本实现。它旨在尽可能忠实于原始 Ja…

Spring-Cloud-OpenFeign源码解析-03-FeignClientFactoryBean

在Spring-Cloud-OpenFeign源码解析-02-OpenFeign自动装配分析到OpenFeign 接口代理对象的创建是通过构建成一个 FeignClientFactoryBean 对象&#xff0c;并最后注入到容器中的&#xff0c;那么这个FeignClientFactoryBean是如何实现代理对象创建的呢&#xff1f; FactoryBean…

基于EKF扩展卡尔曼滤波的一阶环形倒立摆控制系统simulink建模与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 5.完整工程文件 1.课题概述 基于EKF扩展卡尔曼滤波的一阶环形倒立摆控制系统simulink建模与仿真。基于扩展卡尔曼滤波&#xff08;Extended Kalman Filter, EKF&#xff09;的一阶环形倒立摆控制系统&…

docker学习和常用命令

参考视频&#xff1a;05.Docker基础-常见命令_哔哩哔哩_bilibili 镜像仓库datahub docker命令官方文档&#xff1a;docker exec | Docker Docs systemtrl docker 启动docker systemtrl start docker停止docker systemtrl stop docker重启docker systemtrl restart docker设…

【并发程序设计】4. exec函数族

4.exec函数族 exec函数族是一组用于在进程中启动另一个程序来替换当前进程的函数。 exec函数族主要用于在当前进程内部执行一个新的程序&#xff0c;而不会创建新的进程。 子进程调用exec函数&#xff0c;族父进程不受影响。进程当前内容被指定的程序替换&#xff0c;但进程…

【YOLOV5 入门】——Gradio搭建Web GUI

引入&#xff1a;上节搭建的UI可视化界面只能以运行程序弹出窗口的形式运行&#xff0c;不能在网页Web中使用&#xff0c;本次代码将会非常少&#xff01; 一、Gradio简介与安装 Gradio 是一个用于构建机器学习模型演示界面和Web应用的开源库。提供了简单易用的界面&#xff0…

云端的艺术革命:云渲染如何重塑动画与视觉特效产业

在 2019 年&#xff0c;乔恩费儒&#xff08;Jon Favreau&#xff09;决定重拍迪士尼的经典电影《狮子王》。他的创新构想是以真实动物为模型&#xff0c;在非洲草原上拍摄&#xff0c;由真实动物“出演”的辛巴和其他角色&#xff0c;随后通过配音赋予它们生命。 为了实现这一…

janus源码分析(1)--代码结构整理

基础说明 janus官网 https://janus.conf.meetecho.com/index.html janus源码地址 https://github.com/meetecho/janus-gateway 编译及部署参考 https://pro-hnb.blog.csdn.net/article/details/137730389?spm1001.2014.3001.5502 https://pro-hnb.blog.csdn.net/article/deta…

flutter常用的指令(签名、adb、shell、keytool、scrcpy)

flutter常用的指令(签名、adb、shell、keytool、scrcpy) run 指定main_dev.dart debug flutter run -t lib/main_dev.dart --debug指定main_dev.dart release flutter run -t lib/main_dev.dart --release插件用到非空安全情况 flutter run -t lib/main_dev.dart --releas…

Linux mtoolstest命令教程:如何测试和显示mtools配置(附实例详解和注意事项)

Linux mtoolstest命令介绍 mtoolstest是一个用于测试mtools配置文件的命令。只需键入mtoolstest即可调用它&#xff0c;无需任何参数。mtoolstest会读取mtools配置文件&#xff0c;并将累积配置打印到标准输出。输出可以作为配置文件本身使用。 Linux mtoolstest命令适用的Li…

【Python探索之旅】列表

目录 特点 入门 访问元素 新增元素 修改元素 插入元素 删除元素 完结撒花 前言 在Python中&#xff0c;列表(List)是最常用的数据结构之一&#xff0c;类似于其他语言&#xff0c;如Java&#xff0c;与其不同啊Python中不需要声明数据类型。它提供了一种灵活且高效的方式…