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

   

            💓 博客主页:倔强的石头的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.rhkb.cn/news/353188.html

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

相关文章

反激开关电源保险丝以及热敏电阻的选型

保险丝&#xff08;2A/250V&#xff09; 保险丝的选型及计算 1、保险丝的作用就是在电路出现故障造成过流甚至短路时能及时切断电路电源的联系。&#xff08; 保护后 级电路&#xff0c;一旦出现故障&#xff0c;由于电流过大温度过高&#xff0c;保险丝熔断 &#xff09; 2、…

分享:2024年(第12届)“泰迪杯”数据挖掘挑战赛省级奖项获奖名单公示

本次竞赛有评选省奖的省份有广东省、广西壮族自治区、河北省、湖北省。各省奖项依据“泰迪杯”全国评审专家组统一评阅的最终成绩区分省份后从高到低依序按比例产生。 广东省 省级奖项获奖名单公示 奖项设置&#xff1a; 一等奖&#xff1a;约占该省份队伍总数的5%&#xff0…

Datakit管理openGauss6.0集群,监控运维超方便

作者&#xff1a;IT邦德 中国DBA联盟(ACDU)成员&#xff0c;10余年DBA工作经验&#xff0c; Oracle、PostgreSQL ACE CSDN博客专家及B站知名UP主&#xff0c;全网粉丝10万 擅长主流Oracle、MySQL、PG、高斯及Greenplum备份恢复&#xff0c; 安装迁移&#xff0c;性能优化、故障…

聊聊系统架构之负载均衡优化实践

一、写在前面 最近在进行线上监控检查时&#xff0c;我遇到了两个超出预期的案例。首先&#xff0c;网关层的监控数据与应用实际监控数据存在不一致性&#xff0c;尤其是max有较大的差异&#xff0c;详见如下图。其次在某个应用中&#xff0c;通过httpclient请求某域名时发现只…

【OpenGL学习】OpenGL不同版本渲染管线汇总

文章目录 一、《OpenGL编程指南》第6版/第7版的渲染管线二、《OpenGL编程指南》第8版/第9版的渲染管线 一、《OpenGL编程指南》第6版/第7版的渲染管线 图1. OpenGL 2.1、OpenGL 3.0、OpenGL 3.1 等支持的渲染管线 二、《OpenGL编程指南》第8版/第9版的渲染管线 图2. OpenGL …

【系统架构】REST风格

系列文章目录 第一章 系统架构的演进 第二章 REST风格架构 文章目录 系列文章目录前言一、进程间的通信普通管道&#xff08;Pipe&#xff09;或者具名管道&#xff08;Named Pipe&#xff09;信号&#xff08;Signal&#xff09;信号量&#xff08;Semaphore&#xff09;消息…

Java开发的构建神器:Maven以及如何安装部署Maven

目录 一、Maven引言1.1 Maven的核心概念✍. POM (Project Object Model)✌. 依赖管理✍. 生命周期与构建阶段✌. 插件系统 1.2 Maven的工作流程✍. 读取POM文件&#xff1a;✌. 依赖解析&#xff1a;✍. 构建生命周期&#xff1a;✌. 插件执行&#xff1a;✍. 构建输出&#xf…

C#——结构体详情

结构体 结构体也被称为结构类型&#xff08;“structure type”或“struct type”&#xff09;&#xff0c;它是一种可封装数据和相关功能的值类型&#xff0c;在语法上结构体与类&#xff08;class&#xff09;非常相似&#xff0c;它们都可以用来封装数据&#xff0c;并且都…

PHP简约轻型聊天室留言源码

无名轻聊是一款phptxt的轻型聊天室。 无名轻聊特点&#xff1a; 自适应电脑/手机 数据使用txt存放&#xff0c;默认显示近50条聊天记录 采用jqueryajax轮询方式&#xff0c;适合小型聊天环境。 访问地址加?zhi进入管理模式&#xff0c;发送 clear 清空聊天记录。 修改在…

示例:WPF中使用DecodePixelHeight和DecodePixelWidth优化Image性能

一、目的&#xff1a;在使用Image控件时&#xff0c;如果图片太大或者图片数量过多时加载出来的程序内存会非常的大&#xff0c;但一般图片多时我们只要预览缩略图就可以&#xff0c;查看时再显示原图&#xff0c;这个时候需要通过通过设置BitmapImage的DecodePixelHeight和Dec…

若依Ruoyi-vue和element admin的区别,该如何选择。

提到中后台的前端框架&#xff0c;每个人都能列举出很多&#xff0c;这其中提及率比较高的就是Ruoyi和element admin两款&#xff0c;很多小伙伴分不清二者&#xff0c;本文为大家详细讲解一下。 一、若依Ruoyi-vue是什么&#xff1f; 若依Ruoyi-Vue是一款基于 Vue.js 开发的…

随想录Day63 | 单调栈 42. 接雨水 84.柱状图中最大的矩形

随想录Day63 | 单调栈 42. 接雨水 84.柱状图中最大的矩形 42. 接雨水 题目链接 42 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 第一次提交 class Solution { public:int trap(vector<int>…

c++中string用法详解

目录 二、案例需求 三、案例实现 1.首先获取strData中的角色数量 2.创造结构体数组&#xff0c;定义两个索引值 3.循环遍历对结构体User中的Id和Exp进行赋值 4.对结构体数组userArr进行排序 5.展示结果以及最终代码 ​四、最后 一、前言 在C中&#xff0c;std::string …

UITableView之显示单组数据Demo

需求 UITableView实现显示单组数据。尝试设置不同行高度不同。 效果&#xff1a; 数据展示 实现 与之前分组显示数据的区别在于懒加载的数据模型不同。 &#xff08;1&#xff09;声明数据模型类 类的属性一定要和plist中数据的字段保持一致 interface CZhero : NSObject /…

【Android】使用SeekBar控制数据的滚动

项目需求 有一个文本数据比较长&#xff0c;需要在文本右侧加一个SeekBar&#xff0c;然后根据SeekBar的上下滚动来控制文本的滚动。 项目实现 我们使用TextView来显示文本&#xff0c;但是文本比较长的话&#xff0c;需要在TextView外面套一个ScrollView&#xff0c;但是我…

远程连接路由器:方法大全与优缺点解析

远程连接路由器的方式主要有以下几种&#xff0c;以下是每种方式的详细说明及其优缺点&#xff1a; 使用Web浏览器登录 方法&#xff1a;通过配置路由器的远程管理功能&#xff0c;允许用户通过互联网浏览器访问路由器的管理界面。用户只需输入路由器的公网IP地址或域名&#…

vue中通过自定义指令实现一个可拖拽,缩放的弹窗

效果 功能描述 按住头部可拖拽鼠标放到边框&#xff0c;可缩放多层重叠丰富的插槽&#xff0c;易于扩展 示例 指令代码 export const dragDialog {inserted: function (el, { value, minWidth 400, minHeight 200 }) {// 让弹窗居中let dialogHeight el.clientHeight ?…

Vue.js结合ASP.NET Core构建用户登录与权限验证系统

1. 环境准备2. 创建项目3. Vue配置步骤一: 安装包步骤二: 配置文件步骤三: 页面文件 4. 后台配置 在本教程中&#xff0c;我将利用Visual Studio 2022的强大集成开发环境&#xff0c;结合Vue.js前端框架和ASP.NET Core后端框架&#xff0c;从头开始创建一个具备用户登录与权限验…

C# Winform 侧边栏,切换不同页面

在项目中我们经常遇到需要在主界面上切换不同子页面的需求&#xff0c;常用做法是左侧显示子页面菜单&#xff0c;用户通过点击左侧菜单&#xff0c;实现右边子页面的展示。 实例项目实现&#xff1a; 项目左侧侧边栏实现FlowLayoutPanel使用显示不同子窗体 实例链接&#xf…

部署yum仓库

目录 安装软件包 yum 配置文件 缓存功能操作步骤 创建并配置本地仓库文件 yum相关命令 yum install __ yum repolist yum list __ yum info __ yum search __ yum whatprovides __ yum remove __ yum -y update __ yum history yum grouplist yum groupinstall…