news 2026/6/23 12:40:09

数据结构——五十九、冒泡排序(王道408)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
数据结构——五十九、冒泡排序(王道408)

文章目录

  • 前言
  • 一.思路
  • 二.具体例子
  • 三.代码实现
  • 四.算法性能分析
    • 1.空间复杂度
    • 2.时间复杂度
    • 3.稳定性
    • 4.适用性
  • 五.知识回顾与重要考点
  • 结语

前言

本文介绍了冒泡排序算法的基本思路、具体实现和性能分析。冒泡排序通过相邻元素比较交换实现排序,每趟将最小(或最大)元素"冒"到序列前端。算法采用双重循环实现,空间复杂度O(1),最好时间复杂度O(n),最坏和平均时间复杂度O(n²)。该算法稳定,既适用于顺序表也适用于链表。文章通过图示详细演示了排序过程,并给出了C语言实现代码,最后总结了算法特点和重要考点。

基于“交换”的排序:根据序列中两个元素关键字的比较结果来对换这两个记录在序列中的位置

一.思路

  • 从后往前(或从前往后)两两比较相邻元素的值,若为逆序(即A [ i − 1 ] > A [ i ] A[i-1]>A[i]A[i1]>A[i]),则交换它们,直到序列比较完。称这样过程为“一趟”冒泡排序。
  • 每做完一趟冒泡排序,需要注意的是,下一趟冒泡排序时前边已经确定最终位置的元素不用再对比
  • 若某一趟排序没有发生“交换”,说明此时已经整体有序,无需往下对比

二.具体例子

  • 目标:递增
  1. 先对比最后的这两个元素之间的大小关系,27<49,因此不交换
  2. 接下来我们检查再往前的两个元素,13<27,不交换
  3. 接下来再往前链两个元素,76>13,交换
  4. 后面也是一样的,无需做多赘述,直接看最终结果
  5. 第一趟排序使关键字值最小的一个元素“冒”到最前面
  6. 第二趟的处理也是一样,前边已经确定最终位置的元素不用再对比,这里是13
  7. 第2趟结束后,最小的两个元素会“冒”到最前边
  8. 接下来也不再赘述,原理和上面类似,值得注意的是,如果说两个元素的值相同的话,那么我们无需交换位置,这样可以保证算法的稳定性
  9. 若某一趟排序没有发生“交换”,说明此时已经整体有序,无需往下对比

三.代码实现

//交换voidswap(int&a,int&b){inttemp=a;a=b;b=temp;}
//冒泡排序voidBubbleSort(intA[],intn){for(inti=0;i<n-1;i++){bool flag=false;//表示本趟冒泡是否发生交换的标志for(intj=n-1;j>i;j--)//一趟冒泡过程if(A[j-1]>A[j]){//若为逆序swap(A[j-1],A[j]);//交换flag=true;}if(flag==false)return;//本趟遍历后没有发生交换,说明表已经有序}}
  • i所指位置之前的元素都已“有序”,是作为一个界限存在的
  • j为真正的工作指针,指向可能需要交换的元素
  • 只有A [ j − 1 ] > A [ j ] A[j-1]>A[j]A[j1]>A[j]时才交换,因此算法是稳定的
  • 用flag变量表示本次循环是否发生交换,若没有说明已经整体有序,退出循环

四.算法性能分析

1.空间复杂度

  • O(1)

2.时间复杂度

  • 最好情况

    • 比较次数=n-1;交换次数=0
    • 最好时间复杂度=O(n)
  • 最坏情况

    • 比较次数= ( n − 1 ) + ( n − 2 ) + … + 1 = n ( n − 1 ) 2 = =(n-1)+(n-2)+\dotsc +1=\frac{n(n-1)}{2}==(n1)+(n2)++1=2n(n1)=交换次数
    • 最坏时间复杂度= O ( n 2 ) =\mathrm{O}(n^{2})=O(n2)
  • 平均时间复杂度=O(n²)

  • 注意:每次交换都需要移动元素3次

3.稳定性

  • 稳定

4.适用性

  • 冒泡排序是否适用于链表?
  • 按照冒泡排序的思想,在上图中推演一遍,可从前往后“冒泡”,每一趟将更大的元素“冒”到链尾
  • 因此是可以的

五.知识回顾与重要考点

结语

七更😉

如果想查看更多章节,请点击:一、数据结构专栏导航页

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/23 7:00:47

14、Ubuntu实用软件探索与使用指南

Ubuntu实用软件探索与使用指南 在Ubuntu系统中,有许多实用的软件可以满足我们不同的需求,无论是进行桌面出版、音乐创作,还是学习教育知识,都能找到合适的工具。下面将为大家详细介绍几款实用软件的使用方法和相关资源。 1. Inkscape资源推荐 Inkscape是一款强大的矢量绘…

作者头像 李华
网站建设 2026/6/23 9:59:07

18、Ubuntu服务器安装与管理全解析

Ubuntu服务器安装与管理全解析 1. RAID阵列配置 在Ubuntu服务器安装过程中,RAID(独立磁盘冗余阵列)配置是提升性能和数据安全性的重要步骤。配置RAID阵列时,你可以将其当作真实分区进行操作。具体步骤如下: 1. 在所有参与的物理驱动器上创建相同大小的分区。 2. 选择将…

作者头像 李华
网站建设 2026/6/23 5:55:05

19、Ubuntu 服务器包管理全解析

Ubuntu 服务器包管理全解析 1. APT 源配置 在 Ubuntu 系统中,APT 源的配置信息存于 /etc/apt/sources.list 文件。可以使用文本编辑器打开,若不习惯 vim ,也可用更易上手的 nano : $ vim /etc/apt/sources.list以 # 开头的行是注释行,APT 会自动忽略。文件顶部…

作者头像 李华
网站建设 2026/6/23 1:40:15

用AppSmith让你的应用“主动说话“:Web Push实时通知实战

用AppSmith让你的应用"主动说话"&#xff1a;Web Push实时通知实战 【免费下载链接】appsmith appsmithorg/appsmith: Appsmith 是一个开源的无代码开发平台&#xff0c;允许用户通过拖拽式界面构建企业级Web应用程序&#xff0c;无需编写任何后端代码&#xff0c;简…

作者头像 李华
网站建设 2026/6/23 13:44:07

如何快速掌握kafkactl:Apache Kafka命令行管理的终极指南

如何快速掌握kafkactl&#xff1a;Apache Kafka命令行管理的终极指南 【免费下载链接】kafkactl Command Line Tool for managing Apache Kafka 项目地址: https://gitcode.com/gh_mirrors/ka/kafkactl 在当今数据驱动的世界中&#xff0c;Apache Kafka已成为实时数据处…

作者头像 李华
网站建设 2026/6/23 1:20:27

24、Ubuntu社区交流的多元途径

Ubuntu社区交流的多元途径 在Ubuntu社区中,存在多种有效的交流途径,这些途径各具特色,满足了不同用户和开发者的需求。 邮件列表 邮件列表是Ubuntu社区中最重要的交流方式之一。它为重要公告发布和开发讨论提供了空间。目前,有超过300个公共邮件列表,且数量还在不断增加…

作者头像 李华