Golang学习-冒泡排序(Bubble Sort)
📅 2026/7/27 7:52:25
👁️ 次浏览
冒泡排序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)稳定性来源于严格大于才交换会破坏稳定性实际开发中几乎不用冒泡排序但面试中经常考它的优化和稳定性分析
1. 课程论文写作的困境与破局之道作为一名经历过本科、硕士到博士阶段的学术老兵,我深知课程论文对大学生而言既是必修课又是痛点。每到期末,总能看到图书馆里挤满抓耳挠腮的学生,面对空白文档一坐就是几小时却写不出几行字。这种困境背后隐藏…
📅 2026/7/27 7:52:25
还在为水电改造被坑得怀疑人生?这篇干货直接告诉你怎么跟工长砍价、怎么验收才不被糊弄,看完立省一万五。说实话,刚拿到钥匙那会儿,我脑子里全是效果图里那种极简风、无主灯、悬浮吊顶。结果去工地转了一圈,看着满地的线管、灰尘,还有工长那张“我都懂,你只管掏钱”的脸…
📅 2026/7/27 7:50:58
1. 项目概述:为什么Unity Shader是每个开发者绕不开的坎?如果你刚开始接触Unity,或者已经能熟练地摆弄GameObject和C#脚本,但一看到材质球上那些花花绿绿的节点或者满屏的数学公式就头疼,那你来对地方了。Shader&#…
📅 2026/7/27 7:51:25
上周在甘肃的一个铜矿项目现场,我亲眼看着老张因为选错设备,整整耽误了三天进度。那天风沙特大,他手里那台不知名的二手切割机,不仅噪音震耳欲聋,切出来的槽口更是宽窄不一,样品污染严重。最后不得不临时调货,多花了近两万块钱。这事儿让我深刻意识到,在地质勘探这种争…
📅 2026/7/27 9:08:12
最近在折腾几个大模型项目时,我又遇到了那个老问题——上下文太长导致响应变慢、成本飙升。试了几个第三方压缩框架,效果总是不尽如人意,要么压缩率不够,要么关键信息丢失严重。直到把目光转回服务端原生的上下文压缩方案…
📅 2026/7/27 9:08:36
1. 机器学习核心概念解析1.1 奥卡姆剃刀原理:简约而不简单"如无必要,勿增实体"——这句源自14世纪哲学家奥卡姆的威廉的格言,在机器学习领域焕发出新的生命力。这个原理主张在解释现象时应选择假设最少的理论,强调用最简…
📅 2026/7/27 9:08:36
🔥 AI Agent 面试题 577:多Agent系统中的通信安全和消息认证 摘要:本文深入解析了「多Agent系统中的通信安全和消息认证」这一 AI Agent 领域的核心面试题。文章从 通信协议设计 的基本概念出发,系统性地剖析了 通信安全、消息认证…
📅 2026/7/27 9:08:36
🔥 AI Agent 面试题 576:如何实现多Agent系统的协作结果聚合?摘要:本文深入解析了「如何实现多Agent系统的协作结果聚合?」这一 AI Agent 领域的核心面试题。文章从 群体智能 的基本概念出发,系统性地剖析了…
📅 2026/7/27 9:08:36
1. 项目背景与核心需求字符统计这个看似简单的需求,在实际工作中却经常成为数据处理的关键环节。特别是在处理大规模文本、日志分析或数据清洗时,一个高效的字符统计工具能节省大量时间。最近我在处理一批社交媒体数据时,就深刻体会到传统统计…
📅 2026/7/27 9:08:36
现象在 WezTerm 终端中,包含中文路径的文本(如标签页标题、Shell 提示符、路径补全)中,某些汉字时而渲染为日文字形,时而显示为简体中文(中国大陆)字形。以「径」字为例,日文写法右侧…
📅 2026/7/27 0:00:07
这个问题看似在寻找一个答案,实际上是在寻找一种“值得继续投入的方向感”。很多人在问:
“人生有什么意义?”
深层可能是在问:
我现在做的事情值得吗?我的努力有没有价值?我的存在是不是重要?未…
📅 2026/7/27 0:00:07
1. 为什么MoE架构让大模型参数量翻倍却不增加推理成本?去年我在部署一个千亿参数大语言模型时,首次接触到混合专家模型(Mixture of Experts,简称MoE)架构。当时最让我震惊的是,这种架构的模型参数量可以达到…
📅 2026/7/27 0:00:07
更多请点击:
https://codechina.net
第一章:AI帮助理解数学概念 人工智能正以前所未有的方式重塑数学学习的路径。通过自然语言处理与符号计算的深度融合,AI不仅能解析抽象定义,还能将定理、证明和几何直觉转化为可交互、可验证的…
📅 2026/7/27 1:11:21
1. 项目背景与核心价值去年参与的一个短剧项目让我深刻体会到传统创作流程的痛点:编剧团队花了三周打磨剧本,角色设计反复修改了七版,最后成片时又因为演员档期问题不得不临时调整分镜。这种低效的创作模式在快节奏的内容行业越来越难以为继。…
📅 2026/7/27 1:11:21
remix-i18next TypeScript类型安全实践:确保翻译键与类型定义同步 【免费下载链接】remix-i18next The easiest way to translate your React Router framework mode apps 项目地址: https://gitcode.com/gh_mirrors/re/remix-i18next
在开发多语言应用时&am…
📅 2026/7/27 1:11:21
目录
第一步:选对模板,省心一半
第二步:打开扫码点餐功能
开启功能按钮
桌台管理与桌码生成
第三步:个性化设计,打造品牌感
调整点餐页面
设置点餐规则 你还在让顾客站着排队点餐吗?2025年ÿ…
📅 2026/7/27 7:11:38
在业务中快速构建一个能理解私有文档、准确回答专业问题的智能助手,是很多开发团队面临的共同挑战。传统方案往往需要从零开始搭建复杂的 RAG(检索增强生成)系统,涉及文档解析、向量化、检索、大模型调用等多个环节,整…
📅 2026/7/26 17:10:53
FAE放射组学分析工具:医学影像特征探索的完整解决方案 【免费下载链接】FAE FeAture Explorer 项目地址: https://gitcode.com/gh_mirrors/fae/FAE
你是否曾经面对海量医学影像数据感到无从下手?想要从CT、MRI等影像中提取有价值的定量特征&#…
📅 2026/7/27 5:11:32