§1
题目描述
反复扫描数组,相邻元素两两比较,左 > 右就交换。一趟下来最大的沉到末尾。
输入 = [5, 2, 4, 1, 3]
输出 = [1, 2, 3, 4, 5]
§2
思路解析动画文字版
从左到右,比较 (0,1)、(1,2)…每次把较大的换到右侧。一整趟后,最大值一定到了最右;下一趟范围缩小一格,重复。
比较 5、2 · 5 大 → 交换:第 1 趟开始。比相邻的 5 和 2,5 更大,交换它俩。
比较 5、4 · 交换:5 继续和右边的 4 比,5 大,交换。大的数像气泡一样被一路带着往右走。
比较 5、1 · 交换:5 和 1 比,交换。
比较 5、3 · 交换:5 和最后的 3 比,交换。5 到达最右端。
第 1 趟结束 · 5 归位:第 1 趟走完,最大的 5 冒到最右、已归位(绿色)。下一趟只需在前 4 个里冒。
第 2 趟 · 4 归位:第 2 趟在前 4 个里冒泡(过程同理),4 归位。每趟右边已排好的区域(绿色)扩大一格。
第 3 趟 · 3 归位:第 3 趟在前 3 个里冒泡:比 2 和 1,交换 → [1,2,3],3 归位。
第 4 趟 · 全部有序:第 4 趟比 1、2 已有序,最终 [1,2,3,4,5] 全部归位。
冒泡是理解"排序"的最好起点:通过相邻交换逐步消除逆序对。它和选择、插入并称三大基础 O(n²) 排序。
§3
参考代码
n = len(nums)for i in range(n - 1): # 趟数 swapped = False for j in range(n - 1 - i): # 已归位的不用再比 if nums[j] > nums[j+1]: # 相邻逆序 nums[j], nums[j+1] = nums[j+1], nums[j] swapped = True if not swapped: break # 一趟没换=已有序看懂代码不等于写得出。盖住上面,自己默写一遍试试。卡在哪一行说不清,就点右下角问小欧。
§4
复杂度
- 时间复杂度:O(n²),最坏/平均;已有序 O(n)
- 空间复杂度:O(1),原地交换
§5
可套用的代码模板
记住骨架:外层趟数、内层相邻比较、右边 i 个不再动。它是后面理解"为什么快排/归并更快"的对照基准。
Python
for i in range(n - 1): for j in range(n - 1 - i): # 右边 i 个已归位 if a[j] > a[j+1]: swap(j, j+1) # 相邻逆序就换§6
易错点
✗ 错误写法:内层 range(n)
✓ 正确写法:range(n-1-i)
右边已归位的不用再比,也避免 j+1 越界
✗ 错误写法:用 >= 比较
✓ 正确写法:严格 > 才交换
相等不换才能保证"稳定"
这道题到这就讲完了。动画和文字是同一套思路——别光看,关掉页面自己默写一遍。然后顺着主线继续:
下一题 · 排序套路 2/8
→选择排序
简单 · 沿着 排序套路 继续往下推进
把这道题真正学会,再走
图解算法年卡 ¥99 /年
- ✓本题每步动画的吴师兄语音讲解(全站陆续覆盖)
- ✓小欧带 8 步通关训练——追问到不看答案也能写对、能 30 秒讲给面试官听
- ✓学习报告,记录每道题的掌握程度
299道动画图解
37节语音讲解
28课数据结构
¥0.27折合 / 天
76k+ GitHub Star · 吴师兄开源图解算法,几十万开发者在看的算法讲解
¥99 开通年卡 →
想成体系刷透这类套路?去图解算法专题