简单排序 · 冒泡
冒泡排序 图解题解
这道题到底在问什么
反复扫描数组,相邻元素两两比较,左 > 右就交换。一趟下来最大的沉到末尾。
- 输入
- [5, 2, 4, 1, 3]
- 输出
- [1, 2, 3, 4, 5]
最优解:一步一步想明白
- 3从左到右,比较 (0,1)、(1,2)…每次把较大的换到右侧。一整趟后,最大值一定到了最右;下一趟范围缩小一格,重复。
- 4j=0: 5 > 2 换第 1 趟开始。比相邻的 5 和 2,5 更大,交换它俩。
- 5j=1: 5 > 4 换5 继续和右边的 4 比,5 大,交换。大的数像气泡一样被一路带着往右走。
- 6j=2: 5 > 1 换5 和 1 比,交换。
- 7j=3: 5 > 3 换5 和最后的 3 比,交换。5 到达最右端。
- 8第1趟完, 5 归位第 1 趟走完,最大的 5 冒到最右、已归位(绿色)。下一趟只需在前 4 个里冒。
- 9第2趟完, 4 归位第 2 趟在前 4 个里冒泡(过程同理),4 归位。每趟右边已排好的区域(绿色)扩大一格。
- 10第3趟完, 3 归位第 3 趟在前 3 个里冒泡:比 2 和 1,交换 → [1,2,3],3 归位。
- 11已全部有序第 4 趟比 1、2 已有序,最终 [1,2,3,4,5] 全部归位。
- 14冒泡是理解"排序"的最好起点:通过相邻交换逐步消除逆序对。它和选择、插入并称三大基础 O(n²) 排序。
⚠️ 容易写错的地方
✗ 错:内层 range(n)
✓ 对:range(n-1-i)
右边已归位的不用再比,也避免 j+1 越界
✗ 错:用 >= 比较
✓ 对:严格 > 才交换
相等不换才能保证"稳定"
完整代码(Python)
Python
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 # 一趟没换=已有序套路模板 · 冒泡(背下来)
for i in range(n - 1):
for j in range(n - 1 - i): # 右边 i 个已归位
if a[j] > a[j+1]: swap(j, j+1) # 相邻逆序就换复杂度
时间复杂度
O(n²)
最坏/平均;已有序 O(n)
空间复杂度
O(1)
原地交换
看不够?换成动画再走一遍
上面的推演每一步都对应一帧动画。点开交互动画版,能一步步看着 冒泡排序 的数据怎么变、指针怎么走,还能切 Python / Java / C++ 跟着练。
面试官可能追问
这道题为什么用「冒泡」,换最直接的暴力解会差在哪?+
冒泡抓住了本题的结构特征,把暴力解里重复的工作省掉;暴力解通常要多嵌套一层枚举,数据一大就超时。具体对比见上文「暴力解及其卡点」与「最优解逐步推演」两节。
时间复杂度为什么是 undefined?怎么推出来的?+
按上文复杂度小节的推导,时间复杂度为 undefined。
本平台为独立第三方培训机构,与华为技术有限公司无任何关联;课程的服务内容与权益以购买协议为准,学习效果因个人情况而异。「华为 OD」「华为可信」等仅为对岗位与考试方向的客观描述,相关商标归各自权利人所有。