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

news2024/12/23 6:20:13

 前言

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

一冒泡排序

思路

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

具体步骤如下:
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--;
	}
	else
		break;
}
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 end
	for (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--;
			}
			else
				break;
		}
		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.coloradmin.cn/o/1676858.html

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

相关文章

K8S内容

K8S介绍 1、故障迁移:当某一个node节点关机或挂掉后&#xff0c;node节点上的服务会自动转移到另一个node节点上&#xff0c;这个过程所有服务不中断。这是docker或普通云主机是不能做到的 2、资源调度:当node节点上的cpu、内存不够用的时候&#xff0c;可以扩充node节点&…

详细分清Session,Cookie和Token之间的区别,以及JWT是什么东西

Cookie Cookie是一种小型的文本文件&#xff0c;由网站在用户访问时存储在其计算机或移动设备上&#xff0c;Cookie主要用于跟踪、识别和存储有关用户的信息。 简单来说Cookie就是用来存储某些后端发送给前端的数据&#xff0c;例如我们登陆后&#xff0c;后端会返回一个登录…

求正方形阴影部分面积

正方形边长6&#xff0c;求阴影部分面积 xy6① vw6② 1/26v1/23x1/263③ 1/26v1/26y1/266④ ③是左下角三角形的面积&#xff0c;④是左上角三角形的面积。 求解方程组得到x2 阴影部分面积1/2*3x3.

海豚调度器如何看工作流是在哪个worker节点执行

用海豚调度器&#xff0c;执行一个工作流时&#xff0c;有时成功&#xff0c;有时失败&#xff0c;怀疑跟worker节点环境配置不一样有关。要怎样看是在哪个worker节点执行&#xff0c;在 海豚调度器 Web UI 中&#xff0c;您可以查看任务实例&#xff0c;里面有一列显示host&a…

网络安全快速入门(九)MySQL进阶操作

上一章我们了解了对表及库的基本增删查改操作&#xff0c;本章我们针对增删查改内容进行与一些拓展&#xff0c; 9.1字段修饰及数据类型 我们之前在创建表时用到的格式为&#xff1a; create table 表名 ( 字段名1 字段数据类型&#xff08;数据类型长度&#xff09;, 字段名2 …

刷代码随想录有感(65):回溯算法——组合问题

题干&#xff1a; 代码&#xff1a; class Solution { public:vector<vector<int>> res;vector<int> tmp;void backtracking(int n, int k, int start){if(tmp.size() k){res.push_back(tmp);return;}for(int i start; i < n; i){tmp.push_back(i);bac…

[Algorithm][回溯][组合][目标和][组合总和]详细讲解

目录 1.组合1.题目链接2.算法原理详解3.代码实现 2.目标和1.题目链接2.算法原理详解3.代码实现 3.组合总和1.题目链接2.算法原理详解3.代码实现 1.组合 1.题目链接 组合 2.算法原理详解 思路&#xff1a;每次都只选一个数&#xff0c;此后只能选它后面的数函数设计&#xff…

全面提升数据采集效率:亮数据产品的应用与评估详解

全面提升数据采集效率&#xff1a;亮数据产品的应用与评估详解 文章目录 全面提升数据采集效率&#xff1a;亮数据产品的应用与评估详解背景应用场景&#xff1a;平台首页信息抓取准备评测素材详细的产品使用和评测流程产品介绍亮数据的IP代理服务亮数据的爬虫工具及采集技术 注…

elasticsearch使用Ngram实现任意位数手机号搜索

文章目录 Ngram自定义分词案例实战问题拆解 Ngram分词器定义Ngram分词定义Ngram分词示例Ngram分词应用场景 Ngram分词实战 Ngram自定义分词案例 当对keyword类型的字段进行高亮查询时&#xff0c;若值为123asd456&#xff0c;查询sd4&#xff0c;则高亮结果是&#xff1c;em&a…

项目管理-案例重点知识(整合管理)

项目管理&#xff1a;每天进步一点点~ 活到老&#xff0c;学到老 ヾ(◍∇◍)&#xff89;&#xff9e; 何时学习都不晚&#xff0c;加油 一、整合管理 案例重点 重点内容&#xff1a; &#xff08;1&#xff09;项目章程内容和作用 &#xff08;2&#xff09;项目管理计划…

乡村振兴的农业科技创新:加大农业科技投入,推广农业科技成果,提升农业科技创新水平,推动美丽乡村农业现代化

一、引言 随着全球化和信息化时代的到来&#xff0c;农业作为国民经济的基础&#xff0c;其现代化进程日益受到关注。在乡村振兴战略的大背景下&#xff0c;农业科技创新成为推动乡村经济转型升级、实现农业现代化的关键力量。本文旨在探讨如何通过加大农业科技投入、推广农业…

【PB案例学习笔记】-02 目录浏览器

写在前面 这是PB案例学习笔记系列文章的第二篇&#xff0c;该系列文章适合具有一定PB基础的读者&#xff0c; 通过一个个由浅入深的编程实战案例学习&#xff0c;提高编程技巧&#xff0c;以保证小伙伴们能应付公司的各种开发需求。 文章中设计到的源码&#xff0c;小凡都上…

蓝桥杯单片机之模块代码《串口发数据》

过往历程 历程1&#xff1a;秒表 历程2&#xff1a;按键显示时钟 历程3&#xff1a;列矩阵按键显示时钟 历程4&#xff1a;行矩阵按键显示时钟 历程5&#xff1a;新DS1302 历程6&#xff1a;小数点精确后两位ds18b20 历程7&#xff1a;35定时器测量频率 历程8&#xff…

初识鸿蒙之ArkTS基础

前言 学习一种应用程序开发&#xff0c;需要从这种程序的开发语言开始&#xff0c;比如说Android开发从入门到放弃&#xff0c;肯定是从Java基础或者是Kotlin语言基础开始学习的&#xff0c;IOS程序开发也肯定是从object-c开始学习的。鸿蒙软件开发也不例外&#xff0c;如果做…

平衡三进制小数详解与进制转换

标准三进制是“逢三进一&#xff0c;退一还三”的机制&#xff0c;平衡三进制与之类似&#xff0c;但就是偏移了一下变得对称了&#xff0c;平衡三进制与标准三进制可以相互转换&#xff0c;但这样显得有点多余了&#xff0c;所以这里只讲平衡三进制与十进制的转换。 数字系统的…

meshlab: pymeshlab合并多个物体模型并保存(flatten visible layers)

一、关于环境 请参考&#xff1a;pymeshlab遍历文件夹中模型、缩放并导出指定格式-CSDN博客 二、关于代码 本文所给出代码仅为参考&#xff0c;禁止转载和引用&#xff0c;仅供个人学习。 本文所给出的例子是https://download.csdn.net/download/weixin_42605076/89233917中的…

【微记录】dmidecode是干什么的?常用来做什么?如何查看系统支持的PCIe版本号(本质:标准,Desktop Management Interface)

是什么 dmidecode 是一个在 Linux 系统提取硬件信息的命令行工具。DMI 代表桌面管理接口&#xff08;Desktop Management Interface&#xff09;&#xff0c;是一种标准&#xff0c;收集桌面计算机的硬件信息&#xff0c;包括系统制造商、序列号、BIOS 信息、系统资产标签等。…

风电功率预测 | 基于PSO-BP神经网络实现风电功率预测(附matlab完整源码)

风电功率预测 风电功率预测完整代码风电功率预测 基于粒子群优化算法(Particle Swarm Optimization, PSO)的BP神经网络是一种常见的方法,用于实现风电功率预测。下面是一个基于PSO-BP神经网络实现风电功率预测的一般步骤: 数据准备:收集与风电场发电功率相关的数据,包括…

C语言----斐波那契数列(附源代码)

各位看官们好&#xff0c;当我写了上一篇博客杨辉三角后&#xff0c;有一些看官叫我讲一下斐波那契数列。对于这个大家应该是有了解的。最简单的规律就是f(n)f(n-2)f(n-1)。就是当前是前两项之和&#xff0c;然后下标1和0都是1.从第三项开始计算的。那么我们知道规律&#xff0…

旧衣服回收小程序:探索旧衣回收市场的创新发展

每年我国就有将近800万吨旧衣服&#xff0c;在生活水平的日益提高下&#xff0c;这个数字也在逐渐增加。目前&#xff0c;我国旧衣回收的产业链也在完善中&#xff0c;旧衣服出口贸易逐年增加&#xff0c;市场发展空间不断扩大。此外&#xff0c;旧衣回收市场投入低、风险小、利…