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

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: ​【数据结构与算法】冒泡排序:简单易懂的排序算法解析

一、引言

排序算法的简介

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

二、冒泡排序原理

🍃基本思想

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

🍃算法过程

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

三、冒泡排序的实现

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

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

循环趟数:

若数组大小为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. 教学示例:由于冒泡排序的直观性和易于理解性,它经常被用作教学示例来介绍排序算法的基本概念和原理。

总结

  • 冒泡排序,作为一种简单的排序算法,其核心思想是通过不断交换相邻两个元素的位置,使得每一轮迭代后,当前未排序部分的最大值(或最小值,取决于排序的方向)能够“冒”到序列的一端。尽管其时间复杂度在大数据集上并不理想,但冒泡排序在理解算法的基本思想和调试教学等方面仍具有不可忽视的价值。
  • 通过冒泡排序的学习,我们可以深入理解排序算法的基本步骤和原理,为后续学习更高效的排序算法(如快速排序、归并排序等)打下坚实的基础。同时,冒泡排序的直观性也使得它成为算法教学的常用工具,有助于初学者建立对算法设计和实现的直观认识。
  • 在实际应用中,我们通常会选择时间复杂度和空间复杂度更优的排序算法来处理大规模数据。但冒泡排序的简洁性和易理解性,使其在特定场合(如小规模数据排序、算法教学等)仍具有实用价值。
  • 冒泡排序作为一种经典的排序算法,不仅具有其独特的学术价值,也为后续学习更复杂的算法提供了有益的参考和启示。通过掌握冒泡排序的思想和实现方法,我们可以更好地理解排序算法的本质,为后续的学习和研究打下坚实的基础。
相关文章
|
8天前
|
存储 算法 安全
控制局域网上网软件之 Python 字典树算法解析
控制局域网上网软件在现代网络管理中至关重要,用于控制设备的上网行为和访问权限。本文聚焦于字典树(Trie Tree)算法的应用,详细阐述其原理、优势及实现。通过字典树,软件能高效进行关键词匹配和过滤,提升系统性能。文中还提供了Python代码示例,展示了字典树在网址过滤和关键词屏蔽中的具体应用,为局域网的安全和管理提供有力支持。
34 17
|
12天前
|
算法 搜索推荐 Java
【潜意识Java】深度解析黑马项目《苍穹外卖》与蓝桥杯算法的结合问题
本文探讨了如何将算法学习与实际项目相结合,以提升编程竞赛中的解题能力。通过《苍穹外卖》项目,介绍了订单配送路径规划(基于动态规划解决旅行商问题)和商品推荐系统(基于贪心算法)。这些实例不仅展示了算法在实际业务中的应用,还帮助读者更好地准备蓝桥杯等编程竞赛。结合具体代码实现和解析,文章详细说明了如何运用算法优化项目功能,提高解决问题的能力。
48 6
|
2月前
|
存储 算法 安全
基于红黑树的局域网上网行为控制C++ 算法解析
在当今网络环境中,局域网上网行为控制对企业和学校至关重要。本文探讨了一种基于红黑树数据结构的高效算法,用于管理用户的上网行为,如IP地址、上网时长、访问网站类别和流量使用情况。通过红黑树的自平衡特性,确保了高效的查找、插入和删除操作。文中提供了C++代码示例,展示了如何实现该算法,并强调其在网络管理中的应用价值。
|
2月前
|
机器学习/深度学习 人工智能 算法
深入解析图神经网络:Graph Transformer的算法基础与工程实践
Graph Transformer是一种结合了Transformer自注意力机制与图神经网络(GNNs)特点的神经网络模型,专为处理图结构数据而设计。它通过改进的数据表示方法、自注意力机制、拉普拉斯位置编码、消息传递与聚合机制等核心技术,实现了对图中节点间关系信息的高效处理及长程依赖关系的捕捉,显著提升了图相关任务的性能。本文详细解析了Graph Transformer的技术原理、实现细节及应用场景,并通过图书推荐系统的实例,展示了其在实际问题解决中的强大能力。
246 30
|
2月前
|
存储 监控 算法
企业内网监控系统中基于哈希表的 C# 算法解析
在企业内网监控系统中,哈希表作为一种高效的数据结构,能够快速处理大量网络连接和用户操作记录,确保网络安全与效率。通过C#代码示例展示了如何使用哈希表存储和管理用户的登录时间、访问IP及操作行为等信息,实现快速的查找、插入和删除操作。哈希表的应用显著提升了系统的实时性和准确性,尽管存在哈希冲突等问题,但通过合理设计哈希函数和冲突解决策略,可以确保系统稳定运行,为企业提供有力的安全保障。
|
16天前
|
算法 数据安全/隐私保护 计算机视觉
基于Retinex算法的图像去雾matlab仿真
本项目展示了基于Retinex算法的图像去雾技术。完整程序运行效果无水印,使用Matlab2022a开发。核心代码包含详细中文注释和操作步骤视频。Retinex理论由Edwin Land提出,旨在分离图像的光照和反射分量,增强图像对比度、颜色和细节,尤其在雾天条件下表现优异,有效解决图像去雾问题。
|
16天前
|
算法 数据可视化 安全
基于DWA优化算法的机器人路径规划matlab仿真
本项目基于DWA优化算法实现机器人路径规划的MATLAB仿真,适用于动态环境下的自主导航。使用MATLAB2022A版本运行,展示路径规划和预测结果。核心代码通过散点图和轨迹图可视化路径点及预测路径。DWA算法通过定义速度空间、采样候选动作并评估其优劣(目标方向性、障碍物距离、速度一致性),实时调整机器人运动参数,确保安全避障并接近目标。
110 68
|
25天前
|
算法 数据安全/隐私保护
室内障碍物射线追踪算法matlab模拟仿真
### 简介 本项目展示了室内障碍物射线追踪算法在无线通信中的应用。通过Matlab 2022a实现,包含完整程序运行效果(无水印),支持增加发射点和室内墙壁设置。核心代码配有详细中文注释及操作视频。该算法基于几何光学原理,模拟信号在复杂室内环境中的传播路径与强度,涵盖场景建模、射线发射、传播及接收点场强计算等步骤,为无线网络规划提供重要依据。
|
26天前
|
机器学习/深度学习 数据采集 算法
基于GA遗传优化的CNN-GRU-SAM网络时间序列回归预测算法matlab仿真
本项目基于MATLAB2022a实现时间序列预测,采用CNN-GRU-SAM网络结构。卷积层提取局部特征,GRU层处理长期依赖,自注意力机制捕捉全局特征。完整代码含中文注释和操作视频,运行效果无水印展示。算法通过数据归一化、种群初始化、适应度计算、个体更新等步骤优化网络参数,最终输出预测结果。适用于金融市场、气象预报等领域。
基于GA遗传优化的CNN-GRU-SAM网络时间序列回归预测算法matlab仿真
|
26天前
|
算法
基于龙格库塔算法的锅炉单相受热管建模与matlab数值仿真
本设计基于龙格库塔算法对锅炉单相受热管进行建模与MATLAB数值仿真,简化为喷水减温器和末级过热器组合,考虑均匀传热及静态烟气处理。使用MATLAB2022A版本运行,展示自编与内置四阶龙格库塔法的精度对比及误差分析。模型涉及热传递和流体动力学原理,适用于优化锅炉效率。

推荐镜像

更多