​【数据结构与算法】冒泡排序:简单易懂的排序算法解析

news2024/12/21 18:42:17

   

            💓 博客主页:倔强的石头的CSDN主页 

           📝Gitee主页:倔强的石头的gitee主页

            ⏩ 文章专栏:《数据结构与算法》

                                  期待您的关注

1b7335aca73b41609b7f05d1d366f476.gif

目录

一、引言

二、冒泡排序原理

🍃基本思想:

🍃算法过程:

三、冒泡排序的实现

四、冒泡排序的优化

五、冒泡排序的优缺点

六、冒泡排序的应用场景

总结


一、引言

排序算法的简介

排序算法是计算机程序设计中的一种重要操作,其功能是将一个数据元素(或记录)的任意序列,重新排列成一个关键字有序的序列。

二、冒泡排序原理

🍃基本思想

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

🍃算法过程

  • 比较相邻元素:重复地走访需要排序的元素列表,依次比较两个相邻的元素。
  • 交换元素:如果顺序(如从大到小或从小到大)错误,就交换这两个元素的位置。
  • 重复进行:重复以上步骤,直到没有相邻的元素需要交换,则元素列表排序完成。

三、冒泡排序的实现

对于循环趟数和比较次数的控制,如图所示

以升序排序为例,每一趟排序可以将一个较大的值放在后面

循环趟数:

若数组大小为size,则最多需要进行size-1趟排序

(当排序size-1次之后,后面的size-1个元素已经被放在了正确的位置,剩下的一个元素自然不需要排序了)

比较次数:

若数组大小为size,则每一趟需要比较的次数是不同的

第一趟每两个元素都需要比较一次,总共是size-1次

第二趟排序,最后一个元素不需要比较,所以需要比较size-2次

……

总结成规律,每一趟需要比较的次数为size-1-(趟数-1)次

//冒泡排序
void BubbleSort1(DataType* a, int size)//升序排序
{
	for (int i = 0; i < size - 1; i++)//控制排序趟数
	{
		for (int j = 0; j < size - 1 - i; j++)//控制每次比较次数
		{
			if (a[j] > a[j + 1])//不满足升序就交换位置
			{
				DataType tmp = a[j];
				a[j] = a[j + 1];
				a[j + 1] = tmp;
			}
		}
	}
}
void BubbleSort2(DataType* a, int size)//降序排序
{
	for (int i = 0; i < size - 1; i++)//控制排序趟数
	{
		for (int j = 0; j < size - 1 - i; j++)//控制每次比较次数
		{
			if (a[j] < a[j + 1])//不满足降序就交换位置
			{
				DataType tmp = a[j];
				a[j] = a[j + 1];
				a[j + 1] = tmp;
			}
		}
	}
}

 

四、冒泡排序的优化

优化方法

设置一个标志位来判断是否发生了交换,从而提前结束排序

void BubbleSort(DataType* a, int size)//升序排序
{
	for (int i = 0; i < size - 1; i++)//控制排序趟数
	{
		int flag = 1;//标志位
		for (int j = 0; j < size - 1 - i; j++)//控制每次比较次数
		{
			if (a[j] > a[j + 1])//不满足升序就交换位置
			{
				flag = 0;//如果发生交换,改变标志位
				DataType tmp = a[j];
				a[j] = a[j + 1];
				a[j + 1] = tmp;
			}
		}
		if (flag == 1)//如果一趟排序没有发生交换,说明数据已经有序,可以提前结束
			break;
	}
}

五、冒泡排序的优缺点

  1. 优点简单易懂,容易实现,稳定性好(相等的元素在排序后不会改变相对顺序)。
  2. 缺点效率较低,尤其是当待排序序列已经有序或接近有序时,仍然需要执行完整的排序过程。

六、冒泡排序的应用场景

  1. 小型数据集:对于小型数据集,冒泡排序的简洁性和稳定性使其成为一个不错的选择。
  2. 教学示例:由于冒泡排序的直观性和易于理解性,它经常被用作教学示例来介绍排序算法的基本概念和原理。

总结

  • 冒泡排序,作为一种简单的排序算法,其核心思想是通过不断交换相邻两个元素的位置,使得每一轮迭代后,当前未排序部分的最大值(或最小值,取决于排序的方向)能够“冒”到序列的一端。尽管其时间复杂度在大数据集上并不理想,但冒泡排序在理解算法的基本思想和调试教学等方面仍具有不可忽视的价值。
  • 通过冒泡排序的学习,我们可以深入理解排序算法的基本步骤和原理,为后续学习更高效的排序算法(如快速排序、归并排序等)打下坚实的基础。同时,冒泡排序的直观性也使得它成为算法教学的常用工具,有助于初学者建立对算法设计和实现的直观认识。
  • 在实际应用中,我们通常会选择时间复杂度和空间复杂度更优的排序算法来处理大规模数据。但冒泡排序的简洁性和易理解性,使其在特定场合(如小规模数据排序、算法教学等)仍具有实用价值。
  • 冒泡排序作为一种经典的排序算法,不仅具有其独特的学术价值,也为后续学习更复杂的算法提供了有益的参考和启示。通过掌握冒泡排序的思想和实现方法,我们可以更好地理解排序算法的本质,为后续的学习和研究打下坚实的基础。

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

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

相关文章

基于SpringBoot+Vue企业会议室预定管理系统设计和实现

基于SpringBootVue企业会议室预定管理系统设计和实现 &#x1f345; 作者主页 网顺技术团队 &#x1f345; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; &#x1f345; 文末获取源码联系方式 &#x1f4dd; &#x1f345; 查看下方微信号获取联系方式 承接各种定制系统 …

猫头虎 分享已解决Bug || `Uncaught ReferenceError: x is not defined`✨

猫头虎 分享已解决Bug || Uncaught ReferenceError: x is not defined&#x1f680;✨ 摘要 ✨&#x1f4a1; 大家好&#xff0c;我是猫头虎&#xff0c;一名全栈软件工程师&#xff0c;同时也是一位科技自媒体博主。今天我要和大家分享一些前端开发过程中常见的Bug以及详细的…

STM32 proteus + STM32Cubemx仿真教程(第五课ADC光敏电阻采样教程)

文章目录 前言一、ADC概念二、光敏电阻的概念1. 光敏电阻的工作原理2. 光敏电阻的特性3. 光敏电阻的应用4. 光敏电阻的电路设计5. 实际使用中的注意事项总结 三、STM32Cubemx创建工程四、proteus仿真电路图五、代码编写1. HAL_ADC_Start 函数原型参数返回值功能描述示例 2. HAL…

重学java 73.设计模式

本想送你一本沉思录&#xff0c;可该迷途知返的人是我 —— 24.6.18 设计模式 设计模式(Design pattern)&#xff0c;是一套被反复使用、经过分类编目的、代码设计经验的总结&#xff0c;使用设计模式是为了可重用代码、保证代码可靠性、程序的重用性,稳定性。 1995 年&#x…

PHP学习笔记--初学

笔录&#xff1a;我是从黑马里面找的资料学习的&#xff0c;如果有人看我的笔记话&#xff0c;建议去看黑马程序课程&#xff0c;更详细一些。 目录 php定义&#xff0c;平台支持&#xff1a; 静态网站&#xff1a; 动态网站&#xff1a; 服务器概念&#xff1a; IP的概念…

电脑版微信修改信息提示音的方法,Resource Hacker修改EXE信息

微信默认的提示音大家都是一样的&#xff0c;在人多的情况下&#xff0c;不容易分辨是不是自己的微信有消息&#xff0c;很不方便&#xff0c;所以飞飞会把微信的消息提示音换了&#xff0c;手机微信换通知铃声还是很简单的&#xff0c;今天着重和你们分享下电脑版微信如何修改…

探索C嘎嘎的奇妙世界:第十四关---STL(string的模拟实现)

1. string类的模拟实现 1.1 经典的string类问题 上一关已经对string类进行了简单的介绍&#xff0c;大家只要能够正常使用即可。在面试中&#xff0c;面试官总喜欢让学生自己来模拟实现string类&#xff0c;最主要是实现string类的构造、拷贝构造、赋值运算符重载以及析构函数…

Multisim仿真之万用表、安捷伦万用表、信号发生器操作方法

1、XMM是安捷伦示波器 如下图所示&#xff0c;实物安捷伦的外围3个插孔对应于 XMM图标示波器的右侧3个引脚&#xff0c;上下一一对应 2、函数信号发生器XFG 如下图所示&#xff0c;COM就是GND&#xff0c;正负的意思就是相对于GND而言&#xff0c;有正负电压&#xff1b; 3、…

ViNT: A Foundation Model for Visual Navigation

介绍 现存的问题&#xff1a;预训练的方式在很多领域取得了成功&#xff0c;但是由于环境、平台和应用程序的绝对多样性&#xff0c;因此很难应用在机器人领域。 那么想要做移动机器人的基础模型需要什么&#xff1f; 本文定义了一个机器人领域的基础模型&#xff0c;可以实…

Vue2动态代理无须重启项目解决方案

1、痛点 如果我们需要使用不同的环境地址的时候&#xff0c;就需要使用命令或者手动修改vue.config.js中配置来重新启动项目。当项目项目越来越大的时候&#xff0c;我们需要很长的时间来启动项目&#xff0c;如此反复&#xff0c;极大影响我们开发进度。 2、寻求解决方案 ● v…

九大步骤,带你了解典型的GIS开发流程!

GIS是一门强工具属性的交叉学科。强工具属性意味着GIS实际上更多的依附于其他应用场景而存在&#xff0c;而并非独立存在的&#xff0c;简单来说&#xff0c;GIS更多的是作为其他系统中的子系统而存在。 作为GIS从业人员&#xff0c;上限更多取决于所依附的行业&#xff0c;去…

单载波水声通信技术研究【附MATLAB代码】

文章来源&#xff1a;​微信公众号&#xff1a;EW Frontier 摘要 水下无线通信因其在海洋科研、国防、救援及资源开发等方面的关键作用而备受关注。声波作为水中信息传输的有效载体&#xff0c;推动了水声通信技术的发展&#xff0c;其中单载波调制技术由于其高频谱利用率、结…

计算机网络期末复习1(最后一天才开始学版)

1.一个PPP帧的数据部分&#xff08;用十六进制写出&#xff09;是7D 5E FE 27 7D 5D 7D 5D 65 7D 5E。试问真正的数据是&#xff08;用十六进制写出&#xff09; 由于PPP帧的标志字段为7E,因此,为了区别标志字段和信息字段,将信息字段中出现的每一个0x7E转变成(0x7D,0x5E),0x7…

小程序的登录+发布流程

今天我们来将一下小程序的登录和发布流程&#xff01;&#xff01;&#xff01; 小程序的登录流程 流程图 首先登录流程还是看官网说的&#xff1a;https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/login.html 这是官网发布的一个流程图 认识cod…

DOOPRIME:日本央行7月加息与否取决于数据,购债规模调整无强烈信号

摘要 日本央行行长植田和男近日在议会发言中表示&#xff0c;7月份是否加息将取决于经济数据表现&#xff0c;而购买日本国债与加息是两个独立的问题&#xff0c;不会通过削减购债规模来释放强烈的政策信号。这一表态引发了市场的广泛关注&#xff0c;投资者和经济学家对此进行…

自动驾驶规划-RTT* 算法 【免费获取Matlab代码】

目录 1.算法原理3.结果展示4.参考文献5.代码获取 1.算法原理 RRT(Rapidly-Exploring Random Trees) 快速随机扩展树&#xff0c;是一种单一查询路径规划算法。RRT 将根节点作为搜索的起点&#xff0c;然后通过随机撒点采样增加叶子节点的方式&#xff0c;生成一个随机扩展树&a…

如何预防最新的Mallox变种hmallox勒索病毒感染您的计算机?

一、引言 近年来&#xff0c;网络安全问题日益严重&#xff0c;勒索病毒成为了其中的一大威胁。其中&#xff0c;.hmallox勒索病毒作为Malox勒索软件家族的新变种&#xff0c;凭借其高度的攻击性和隐蔽性&#xff0c;给全球用户的数据安全带来了严重威胁。本文将深入分析.hmal…

入门三.HTB--Dancing(6.18)

大佬 https://www.cnblogs.com/Hekeats-L/p/16535920.html 任务1 SMB 即Server Message Block&#xff08;服务器消息块&#xff09;&#xff0c;是一种文件共享协议。当文件原件在你的A电脑上&#xff0c;而你想在局域网下用你的手机、iPad或是另一台电脑来访问A电脑上的该文…

分享三个仓库

Hello , 我是恒。大概有半个月没有发文章了&#xff0c;都写在文档里了 今天分享三个我开源的项目&#xff0c;比较小巧但是有用 主页 文档导航 Github地址: https://github.com/lmliheng/document 在线访问:http://document.liheng.work/ 里面有各种作者书写的文档&#xff…

ARM32开发——中断

&#x1f3ac; 秋野酱&#xff1a;《个人主页》 &#x1f525; 个人专栏:《Java专栏》《Python专栏》 ⛺️心若有所向往,何惧道阻且长 文章目录 中断概念中断分类中断触发条件 中断概念 中断是计算机系统中的一种机制&#xff0c;用于响应外部事件或内部事件,它可以使单片机暂…