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

发布时间:2026/9/10 10:31:30

Golang学习-冒泡排序(Bubble Sort) 冒泡排序Bubble Sort一、算法思想冒泡排序的核心思想非常朴素相邻元素两两比较如果前一个比后一个大就交换它们。每一轮冒泡都会把当前未排序部分的最大值浮到最右端——就像气泡从水底往上冒一样这就是名称的由来。以[5, 3, 8, 1, 2]为例第一轮冒泡的过程[5, 3, 8, 1, 2] 比较 5 和 3 → 53交换 [3, 5, 8, 1, 2] 比较 5 和 8 → 58不交换 [3, 5, 8, 1, 2] 比较 8 和 1 → 81交换 [3, 5, 1, 8, 2] 比较 8 和 2 → 82交换 [3, 5, 1, 2, 8] ← 8 已冒泡到最右端第二轮继续在[3, 5, 1, 2]中冒泡把次大值 5 推到倒数第二位……以此类推n 个元素最多需要 n-1 轮冒泡。二、Go 实现2.1 基础版本packagemainimportfmt// BubbleSort 基础冒泡排序funcBubbleSort(arr[]int){n:len(arr)fori:0;in-1;i{// 外层控制冒泡轮数forj:0;jn-i-1;j{// 内层每轮比较范围逐渐缩小ifarr[j]arr[j1]{// 相邻比较左大右小就交换arr[j],arr[j1]arr[j1],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;in-1;i{swapped:falseforj:0;jn-i-1;j{ifarr[j]arr[j1]{arr[j],arr[j1]arr[j1],arr[j]swappedtrue}}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;in-1;i{swapped:falseborder:lastSwap// 本轮只需遍历到上一轮最后交换处forj:0;jborder;j{ifarr[j]arr[j1]{arr[j],arr[j1]arr[j1],arr[j]swappedtruelastSwapj// 记录本次交换的位置}}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[j1]时才交换严格大于arr[j] arr[j1]时不会交换所以相等元素的相对顺序不会被改变。原始: [3a, 3b, 1] (3a 和 3b 值相同a 在 b 前) 排序后: [1, 3a, 3b] ← 3a 仍在 3b 前面稳定 ✓如果改为arr[j] arr[j1]就交换就会破坏稳定性——这是面试常见陷阱。五、冒泡排序 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²) 的复杂度在大数据下不可接受。但它仍有价值教学用途最直观的排序算法适合入门理解排序的本质小数据量n 50 时 O(n²) 和 O(n log n) 差异不明显近乎有序的数据优化版冒泡对几乎排好的数据非常高效接近 O(n))检测有序性用优化版跑一遍如果一轮就退出则说明数据已有序七、用冒泡思想解决实际问题7.1 找数组中第 k 大的元素不需要完全排序只跑 k 轮冒泡最右端就会出现第 k 大的值// BubbleTopK 找第 k 大的元素只冒泡 k 轮funcBubbleTopK(arr[]int,kint)int{n:len(arr)fori:0;ik;i{forj:0;jn-i-1;j{ifarr[j]arr[j1]{arr[j],arr[j1]arr[j1],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)稳定性来源于严格大于才交换会破坏稳定性实际开发中几乎不用冒泡排序但面试中经常考它的优化和稳定性分析
延伸阅读

更多相关文章

2026/9/11 2:39:32

智能写作辅助系统:课程论文写作的AI解决方案

1. 课程论文写作的困境与破局之道作为一名经历过本科、硕士到博士阶段的学术老兵,我深知课程论文对大学生而言既是必修课又是痛点。每到期末,总能看到图书馆里挤满抓耳挠腮的学生,面对空白文档一坐就是几小时却写不出几行字。这种困境背后隐藏…

2026/9/6 22:02:58

RANSAC算法在点云处理中的原理与实践优化

1. RANSAC算法核心思想解析在三维点云处理中,RANSAC(Random Sample Consensus)算法是处理噪声数据的经典方法。我第一次接触这个算法是在处理激光雷达点云时,当时需要从包含大量地面噪声的点云中提取建筑物轮廓。传统最小二乘法在…

2026/9/10 14:20:51

【华为OD机试真题 新系统】1057、物流仓储多维度成本利润综合查询系统 | 机试真题+思路参考+代码解析(C++、Java、Py、C语言、JS)

文章目录 一、题目 🎃题目描述 🎃输入输出 🎃样例1 🎃样例2 二、代码与思路参考 🎈C++语言思路 🎉C++代码 🎈Java语言思路 🎉Java代码 🎈Python语言思路 🎉Python代码 🎈C语言思路 🎉 C语言代码 🎈JS语言思路 🎉JS代码 作者:KJ.JK 订阅本专栏后即…

2026/9/11 2:40:10

源码证据驱动:如何审阅Valhalla这类开源基础设施项目

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/11 2:40:10

CPPS 2026全景:11位嘉宾、9大专题与C++的下一个十年

2026年11月20-21日,北京万达文华酒店,C及系统软件技术大会(CPP-Summit)将再次启幕。作为与奇点智能技术大会同期同场举办的技术盛会,CPPS 2026以11位演讲嘉宾与9大专题,勾勒出C与系统软件的下一个十年。 直…

2026/9/11 2:40:09

车载Android串口通信实战:UART/RS232/RS485选型与Modbus RTU对接

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/11 2:35:09

声振温监测方案拆解:从传感器选型到可视化看板落地

设备管理人员最怕的,从来不是“设备坏了”这件事本身,而是“不知道它快坏了”。传统模式下,转动设备就像一台关在铁皮柜子里的黑箱——巡检员拿听音棒贴上去听一听,用手背试一下壳体温度,再凭经验判断“还行”或者“有…

2026/9/10 16:39:38

超人会飞不算本事:系统稳定依赖清晰规则与边界设计

开头先不绕弯子。“#斯坦李吐槽dc 所以超人是无缘无故会飞的嘛哈哈哈哈哈哈哈锤哥真是技术人才啊!#雷神 #复联”这类调侃式短标题,第一波冲击力在于它把两个宇宙的角色塞进同一个吐槽箱里,但细想一下就能发现,它真正碰到的根本不是…

2026/9/10 11:16:38

超人VS蜘蛛侠:拆解超级IP的影响力与传播方法论

把“蜘蛛侠 vs 超人”放在 CSDN 上聊,可能很多人第一反应是走错片场了。但如果把这两个角色看成“两个持续运营了 80 多年的文化产品”,你会发现,这场比较本质上是两个不同 IP 策略的长期结果对比:超人赢在定义了整个超级英雄题材…

2026/9/9 16:31:09

基于CNN的调制信号识别:MATLAB实现时频图分类实战

简介:本资源是一套面向通信工程与信号处理方向学习者、研究者的深度学习实践方案,聚焦调制信号自动检测与识别这一典型无线通信任务,解决传统方法依赖人工特征、低信噪比下性能下降等痛点。压缩包共12个文件(10.73MB)&…

2026/9/10 12:32:02

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/10 15:19:50

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/10 15:49:53

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
咨询二维码