【排序算法】五、冒泡排序(C/C++)

「前言」文章内容是排序算法之冒泡排序的讲解。(所有文章已经分类好,放心食用)

「归属专栏」排序算法

「主页链接」个人主页

「笔者」枫叶先生(fy)

目录

  • 冒泡排序
    • 1.1 原理
    • 1.2 代码实现(C/C++)
    • 1.3 特性总结

冒泡排序

1.1 原理

交换排序

  • 基本思想:所谓交换,就是根据序列中两个记录键值的比较结果来对换这两个记录在序列中的位置
  • 交换排序的特点是:将键值较大的记录向序列的尾部移动,键值较小的记录向序列的前部移动
  • 属于交换排序有:冒泡排序和快速排序

冒泡排序

冒泡排序是一种简单的排序算法

冒泡排序:基于数组(顺序表)的结构进行排序

原理:

  • 它重复地遍历要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来
  • 重复地进行直到没有再需要交换,也就是说该数列已经排序完成

具体步骤如下:

  1. 比较相邻的元素。如果第一个比第二个大,就交换它们两个
  2. 对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数
  3. 针对所有的元素重复以上的步骤,除了最后一个
  4. 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较

举例

原始数组如下,使用冒泡排序进行排序(升序)
在这里插入图片描述
第一趟:对0-n-1个元素进行遍历,依次对比前后的大小,若是不满足前小后大就交换,此时最大的数就被挪到了最后一个位置(10个元素比较了9次)
在这里插入图片描述

第二趟:对0-n-2个元素进行遍历,依次对比前后的大小,若是不满足前小后大就交换,此时最大的数就被挪到了倒数第二个位置。

由于9已经判断为最大值,所以第二次冒泡排序时就需要找出除9之外的无序表中的最大值,比较过程和第一趟排序完全相同(9个元素比较了8次,除掉9)
在这里插入图片描述
重复上述动作,每一次都将最大的数向后移动,直到遍数组有序

动图演示:

在这里插入图片描述

1.2 代码实现(C/C++)

代码实现如下:(升序)


void Swap(int* p1, int* p2)
{
	int tmp = *p1;
	*p1 = *p2;
	*p2 = tmp;
}

// 冒泡排序
void BubbleSort(int* arr, int n)
{
	for (int i = 0; i < n - 1; i++)
	{
		//每一趟冒泡的过程
		for (int j = 0; j < n - 1 - i; j++)
		{
			if (arr[j] > arr[j + 1])
			{
				Swap(&arr[j], &arr[j + 1]); // 交换
			}
		}
	}
}

优化

观察发现当数组已经有序了(假设是升序),如[1,2,3,4,5,6,7,8],上面的代码依旧继续进行下一轮的比较,直到所有的数进行比较、排序完,很明显后面的比较没有意义的这就会让这些代码的效率降低

在这种情况下,我们就不必要对有序的数进行排序,以此减少代码执行的次数,提高代码的效率。

因此,可以设置一个exchange ,如果已经排好序了就令 exchange == 0结束循环;如果不是有序的就令exchange == 1继续执行

代码如下:

void Swap(int* p1, int* p2)
{
	int tmp = *p1;
	*p1 = *p2;
	*p2 = tmp;
}

// 冒泡排序
void BubbleSort(int* arr, int n)
{
	assert(arr);

	for (int i = 0; i < n - 1; i++)
	{
		int exchange = 0;// 记录该趟猫爬排序是否进行交换
		// 每一趟冒泡的过程
		for (int j = 0; j < n - 1 - i; j++)
		{
			if (arr[j] > arr[j + 1])
			{
				Swap(&arr[j], &arr[j + 1]); // 交换
				exchange = 1; // 发生数据交换,置exchange为1
			}
		}
		if (exchange == 0) // 该趟冒泡排序没有进行交换,已有序,跳出循环
		{
			break;
		}
	}
}

1.3 特性总结

冒泡排序特性总结

  • 时间复杂度:O(N^2)
  • 空间复杂度:O(1)
  • 稳定性:稳定
  • 适用范围:冒泡排序适用于小型的数据集,对于大型数据集效率较低

--------------------- END ----------------------

「 作者 」 枫叶先生
「 更新 」 2024.1.20
「 声明 」 余之才疏学浅,故所撰文疏漏难免,
          或有谬误或不准确之处,敬请读者批评指正。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

每日一题——1295.统计位数为偶数的数字

方法一 个人方法&#xff1a; 想知道整数型数字有多少位&#xff0c;可以直接把数字转字符&#xff0c;看字符的长度就是数字的位数 var findNumbers function(nums) {let count0for(let num of nums){let strnumif(str.length%20) count}return count }; 消耗时间和内存情况…

uni-app使用HBuilderX打包Web项目

非常简单&#xff0c;就是容易忘记 一、找到manifest.json配置Web配置 二、源码视图配置 "h5" : {"template" : "","domain" : "xxx.xx.xx.xxx","publicPath" : "./","devServer" : {&quo…

【Java程序员面试专栏 专业技能篇】MySQL核心面试指引(一):基础知识考察

关于MySQL部分的核心知识进行一网打尽,包括三部分:基础知识考察、核心机制策略、性能优化策略,通过一篇文章串联面试重点,并且帮助加强日常基础知识的理解,全局思维导图如下所示 本篇Blog为第一部分:基础知识考察,子节点表示追问或同级提问 基本概念 包括一些核心问…

什么是葡萄酒“质量三级标准”?

在葡萄酒的世界里有一个笼统的级别分为&#xff1a;入门、精品和顶级。那么&#xff0c;对应这三个级别的标准都是什么呢&#xff1f; 入门级别的标准&#xff1a;入门级别的酒首先喝起来新鲜且顺口。新鲜很容易理解&#xff0c;就是没有腐熟水果的味道&#xff0c;也就是“罐…

8.3最大自序和(LC53-M)

算法&#xff1a; 如果 -2 1 在一起&#xff0c;计算起点的时候&#xff0c;一定是从 1 开始计算&#xff0c;因为负数只会拉低总和&#xff0c;这就是贪心贪的地方&#xff01; &#xff08;-21&#xff0c;起点为负数&#xff0c;加上后面的数&#xff0c;只会让和变小&…

《WebKit 技术内幕》之六(3): CSS解释器和样式布局

3 WebKit布局 3.1 基础 当WebKit创建RenderObject对象之后&#xff0c;每个对象是不知道自己的位置、大小等信息的&#xff0c;WebKit根据框模型来计算它们的位置、大小等信息的过程称为布局计算&#xff08;或者称为排版&#xff09;。 图描述了这一过程中涉及的主要WebKit…

浅谈 ret2text

文章目录 ret2text无需传参重构传参函数调用约定x86x64 ret2text ret2text就是执行程序中已有的代码&#xff0c;例如程序中写有system等系统的调用函数 无需传参 如果程序的后门函数参数已经满足 getshell 的需求&#xff0c;那么就可以直接溢出覆盖 ret 地址不用考虑传参问…

SystemC学习笔记(三) - 查看模块的波形

简述 波形在Simulation/Emulation中地位十分重要&#xff0c;尤其是在研发初期&#xff0c;只能通过波形来查看软件hang住的位置。 对于TLM来说&#xff0c;查看波形一般是指查看pvbus上的transaction&#xff0c;而对于SystemC本身来说&#xff0c;查看波形就是使用Gtkwave或…

WeChall

WeChall-Scored Challenges 一、Get Sourced二、Stegano I三、Crypto - Caesar I四、WWW-Robots五、 ASCII六、URL七、Christmas Hippety八、No DNS 网站链接&#xff1a;https://www.wechall.net/challs/Training/by/chall_score/ASC/page-1 一、Get Sourced 题目链接&#…

HTML+JavaScript-01

说明 之前有一篇JavaWeb-JavaScript中只是简单介绍了一点JavaScript的内容&#xff0c;这篇笔记算是续写的&#xff0c;但是从01开始编号。 引入js文件 html、css、js俗称前端三剑客&#xff0c;一般都是分开写&#xff0c;先写框架、再写css、最后写js。因此在工程量大的情…

HarmonyOS—配置开发环境

应用/服务支持API Version 4至9&#xff0c;首次使用DevEco Studio&#xff0c;工具的配置向导会引导您下载SDK及工具链。配置向导默认下载 API Version 9的SDK及工具链&#xff0c;如需下载API Version 4至8&#xff0c;可在工程配置完成后&#xff0c;进入HarmonyOS SDK界面手…

福建专业建筑清水模板 — 安全可靠的选择

在福建地区的建筑工程中&#xff0c;选择高质量的清水模板对于确保结构的美观和工程的安全至关重要。我们能强优品木业提供的专业建筑清水模板&#xff0c;以其卓越的质量和安全性&#xff0c;成为施工团队的首选。 产品特性 优质材料制作&#xff1a;选用高品质木材制作&…

机械设计-哈工大课程学习-螺纹连接

圆柱螺纹主要几何参数螺纹参数 ①外径&#xff08;大径&#xff09;&#xff0c;与外螺纹牙顶或内螺纹牙底相重合的假想圆柱体直径。螺纹的公称直径即大径。 ②内径&#xff08;小径&#xff09;&#xff0c;与外螺纹牙底或内螺纹牙顶相重合的假想圆柱体直径。 ③中径&#xff…

React 初次接触

背景 还是为了完善高大上的在线文档系统&#xff0c;虽然比着葫芦画瓢的修改了一些所谓的代码&#xff0c;慢慢的才发现&#xff0c;原来这就是传说中的React&#xff0c;所以有比较又要囫囵吞枣一下React。 基本原理 参照《React技术揭秘》 网上有电子版 &#xff0c;应该是…

selenium-java中切换iframe

1、当iframe中有固定的name或者id时可以通过name和id进行切换,代码如下 driver.switchTo().frame("name"); 2、当iframe中没有固定的name或者id时可以通过iframe角标进行切换&#xff0c;在浏览器通过ctrlf快捷键&#xff0c;搜索标签框输入//iframe;来查看当前ifr…

11、Kafka ------ Kafka 核心API 及 生产者API 讲解

目录 Kafka核心API 及 生产者API讲解★ Kafka的核心APIKafka包含如下5类核心API&#xff1a; ★ 生产者APIKafka 的API 文档 ★ 使用生产者API发送消息 Kafka核心API 及 生产者API讲解 官方文档 ★ Kafka的核心API Kafka包含如下5类核心API&#xff1a; Producer API&#x…

一维数组2和二维数组1

1.一维数组在内存中的储存 在前面创建的数组中&#xff0c;每个元素是怎么储存的呢&#xff1f;我们通过观察元素的地址来看看吧。 %p是用来打印地址的。 结果为&#xff1a; 由此可看出每个地址都相隔一个int类型的距离&#xff0c;可以看出数组在内存中是连续存放的。也就是…

Pytest 测试框架与Allure 测试报告——Allure2测试报告-L1

目录&#xff1a; allure2安装 Allure2介绍Allure2报告展示Allure2报告展示-首页概览Allure2报告展示-用例详情页Allure2安装Allure2下载与安装Allure环境验证插件安装-Python插件安装-Java验证插件安装-Javaallure2运行方式 生成测试报告流程使用Allure2运行方式-Python使用A…

Android逆向之指令集和CPU架构

文章目录 前言引子 指令集复杂指令集&#xff08;CISC&#xff09;精简指令集&#xff08;RISC&#xff09;RISC-VARM和x86的区别指令集和汇编汇编语言是用人类看得懂的语言来描述指令集不同指令集对应不同的汇编语言 ARM和x86指令集差异ARM指令集x86指令集 CPU架构和ABI什么是…

YARN节点故障的容错方案

YARN节点故障的容错方案 1. RM高可用1.1 选主和HA切换逻辑 2. NM高可用2.1 感知NM节点异常2.2 异常NM上的任务处理 4. 疑问和思考4,1 RM感知NM异常需要10min&#xff0c;对于app来说是否太长了&#xff1f; 5. 参考文档 本文主要探讨yarn集群的高可用容错方案和容错能力的探讨。…