尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

Golang学习-冒泡排序(Bubble Sort)

Golang学习-冒泡排序(Bubble Sort)
📅 发布时间:2026/7/27 8:00:57

冒泡排序(Bubble Sort)

一、算法思想

冒泡排序的核心思想非常朴素:相邻元素两两比较,如果前一个比后一个大就交换它们。每一轮"冒泡"都会把当前未排序部分的最大值"浮"到最右端——就像气泡从水底往上冒一样,这就是名称的由来。

以[5, 3, 8, 1, 2]为例,第一轮冒泡的过程:

[5, 3, 8, 1, 2] 比较 5 和 3 → 5>3,交换 [3, 5, 8, 1, 2] 比较 5 和 8 → 5<8,不交换 [3, 5, 8, 1, 2] 比较 8 和 1 → 8>1,交换 [3, 5, 1, 8, 2] 比较 8 和 2 → 8>2,交换 [3, 5, 1, 2, 8] ← 8 已"冒泡"到最右端

第二轮继续在[3, 5, 1, 2]中冒泡,把次大值 5 推到倒数第二位……以此类推,n 个元素最多需要 n-1 轮冒泡。

二、Go 实现

2.1 基础版本

packagemainimport"fmt"// BubbleSort 基础冒泡排序funcBubbleSort(arr[]int){n:=len(arr)fori:=0;i<n-1;i++{// 外层:控制冒泡轮数forj:=0;j<n-i-1;j++{// 内层:每轮比较范围逐渐缩小ifarr[j]>arr[j+1]{// 相邻比较,左大右小就交换arr[j],arr[j+1]=arr[j+1],arr[j]}}}}funcmain(){arr:=[]int{5,3,8,1,2,7,4,6}fmt.Println("排序前:",arr)BubbleSort(arr)fmt.Println("排序后:",arr)}

运行结果:

排序前: [5 3 8 1 2 7 4 6] 排序后: [1 2 3 4 5 6 7 8]

2.2 优化版本:提前终止

如果某一轮冒泡过程中没有发生任何交换,说明数组已经排好序了,没必要继续后续轮次。我们可以用一个swapped标记来检测这种情况。

// BubbleSortOptimized 优化冒泡排序(提前终止)funcBubbleSortOptimized(arr[]int){n:=len(arr)fori:=0;i<n-1;i++{swapped:=falseforj:=0;j<n-i-1;j++{ifarr[j]>arr[j+1]{arr[j],arr[j+1]=arr[j+1],arr[j]swapped=true}}if!swapped{// 这一轮没有交换,数组已有序break}}}

对于已经排好序的数组[1, 2, 3, 4, 5],优化版只需要一轮就检测到没有交换并终止——从 O(n²) 降到了 O(n)。

2.3 进一步优化:记录最后交换位置

每轮冒泡后,最后发生交换的位置之后的元素其实已经排好了。下一轮只需要遍历到这个位置即可,不必遍历到n-i-1。

// BubbleSortAdvanced 双优化冒泡排序(提前终止 + 缩减范围)funcBubbleSortAdvanced(arr[]int){n:=len(arr)lastSwap:=n-1// 上一轮最后交换的位置fori:=0;i<n-1;i++{swapped:=falseborder:=lastSwap// 本轮只需遍历到上一轮最后交换处forj:=0;j<border;j++{ifarr[j]>arr[j+1]{arr[j],arr[j+1]=arr[j+1],arr[j]swapped=truelastSwap=j// 记录本次交换的位置}}if!swapped{break}}}

这个优化对部分有序的数组效果显著——比如[2, 1, 3, 4, 5, 6, 7],只需要处理前两个元素,后面的大段有序区域完全跳过。

三、复杂度分析

情况时间复杂度说明
最坏情况O(n²)逆序数组,每轮都要全量比较和交换
最好情况O(n)已排序数组,优化版一轮就退出
平均情况O(n²)随机数组,平均需要约 n²/2 次比较

| 空间复杂度 | O(1) | 原地排序,只需常数额外空间 |

3.1 比较次数推导

最坏情况下:

  • 第 1 轮比较 n-1 次
  • 第 2 轮比较 n-2 次
  • …
  • 第 n-1 轮比较 1 次

总比较次数 = (n-1) + (n-2) + … + 1 = n(n-1)/2 →O(n²)

3.2 交换次数推导

最坏情况(完全逆序)下每次比较都需要交换,交换次数 = 比较次数 = n(n-1)/2 →O(n²)

四、稳定性分析

冒泡排序是稳定排序。

稳定性定义:如果两个相等的元素在排序前后相对顺序不变,则排序是稳定的。

冒泡排序只有当arr[j] > arr[j+1]时才交换(严格大于),arr[j] == arr[j+1]时不会交换,所以相等元素的相对顺序不会被改变。

原始: [3a, 3b, 1] (3a 和 3b 值相同,a 在 b 前) 排序后: [1, 3a, 3b] ← 3a 仍在 3b 前面,稳定 ✓

如果改为arr[j] >= arr[j+1]就交换,就会破坏稳定性——这是面试常见陷阱。

五、冒泡排序 vs 其他排序

对比维度冒泡排序选择排序插入排序
最好时间O(n)(优化版)O(n²)O(n)
平均时间O(n²)O(n²)O(n²)
最坏时间O(n²)O(n²)O(n²)
空间O(1)O(1)O(1)
稳定性✅ 稳定❌ 不稳定✅ 稳定
交换次数多(每次比较都可能交换)少(每轮只交换1次)中等

六、适用场景

冒泡排序的实际应用场景非常有限,因为 O(n²) 的复杂度在大数据下不可接受。但它仍有价值:

  1. 教学用途:最直观的排序算法,适合入门理解排序的本质
  2. 小数据量:n < 50 时 O(n²) 和 O(n log n) 差异不明显
  3. 近乎有序的数据:优化版冒泡对几乎排好的数据非常高效(接近 O(n))
  4. 检测有序性:用优化版跑一遍,如果一轮就退出则说明数据已有序

七、用冒泡思想解决实际问题

7.1 找数组中第 k 大的元素

不需要完全排序,只跑 k 轮冒泡,最右端就会出现第 k 大的值:

// BubbleTopK 找第 k 大的元素(只冒泡 k 轮)funcBubbleTopK(arr[]int,kint)int{n:=len(arr)fori:=0;i<k;i++{forj:=0;j<n-i-1;j++{ifarr[j]>arr[j+1]{arr[j],arr[j+1]=arr[j+1],arr[j]}}}returnarr[n-k]}funcmain(){arr:=[]int{3,1,5,2,4}fmt.Println("第2大:",BubbleTopK(arr,2))// 4}

这种做法的时间复杂度是 O(n × k),比完全排序 O(n²) 快——当然,更优的做法是用快速选择(O(n) 平均),但冒泡思路简单直观。

八、小结

冒泡排序是最容易理解的排序算法,但也是效率最低的之一。它的核心价值不在实际应用,而在帮助理解排序的基本机制——比较、交换、轮次推进。

关键记忆点:

  • 相邻比较,大者右移——这就是冒泡的全部逻辑
  • 优化版提前终止可以把最好情况降到 O(n)
  • 稳定性来源于严格大于才交换,>=会破坏稳定性
  • 实际开发中几乎不用冒泡排序,但面试中经常考它的优化和稳定性分析

相关新闻

  • Linux网络排查利器:ss命令核心用法与实战场景详解
  • 2026实测教程:微信保存的表情包怎么发到抖音?亲测免费方法 - 图片处理研究员
  • AlphaDojo:金融AI Agent框架部署与实战指南

最新新闻

  • Claude Code安装和使用教程—接入deepseek模型和GLM等其他三方模型
  • AI降重工具评测与学术论文优化技巧
  • KVM主题:GPU直通与显卡虚拟化基础解析
  • USB2.0 24位高精度多路测温与多功能测控一体化采集卡
  • 斯特林数C++实现:从数学原理到高精度计算与动态规划优化
  • AI如何重构就业市场:从岗位替代到能力升级的深度解析

日新闻

  • OpenClaw开源智能体网关:AI助手与即时通讯的完美融合
  • 写一个简单的sh脚本
  • 2026年 西安缝隙天线厂家:5G通信与车载天线专业定制供应商深度分析 - 卓企推荐

周新闻

  • 大连理工大学与东京大学联手打造的“主动型AI助手“
  • 170.2026年国家级科研瓶颈:超精密单点金刚石切削(SPDT)光学表面生成
  • SongBloom:革命性歌曲生成框架深度解析——如何通过交织自回归与扩散模型创作完整音乐

月新闻

  • 2026年6月公司网站搭建最新热门渠道测评:四大低成本/零代码平台对比+避坑
  • 【Linux】Linux arm 编译QT程序,出现expected “}“报错
  • 【MATLAB例程】四基站二维AOA定位与距离辅助增强对比仿真。基于角度观测和测距修正的固定目标平面定位精度分析

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号