题目描述
思路解析动画文字版
记住两件事:一是相邻比较、大的右移;二是每趟结束都会有一格被锁定在它的最终位置。下面绿色就是已经锁定、排好的格子。
第 1 趟开始。绿色那 0 格是前几趟已经锁定排好的,这一趟只在下标 0 到 4 之间相邻比较。
比相邻的两根:下标 0 是 5,下标 1 是 2。左边 5 比右边 2 大,要交换。
5 比 2 大,两根换位:现在下标 0 是 2,下标 1 是 5。大的那根又往右挪了一步。
比相邻的两根:下标 1 是 5,下标 2 是 4。左边 5 比右边 4 大,要交换。
5 比 4 大,两根换位:现在下标 1 是 4,下标 2 是 5。大的那根又往右挪了一步。
比相邻的两根:下标 2 是 5,下标 3 是 1。左边 5 比右边 1 大,要交换。
5 比 1 大,两根换位:现在下标 2 是 1,下标 3 是 5。大的那根又往右挪了一步。
比相邻的两根:下标 3 是 5,下标 4 是 3。左边 5 比右边 3 大,要交换。
5 比 3 大,两根换位:现在下标 3 是 3,下标 4 是 5。大的那根又往右挪了一步。
第 1 趟跑完,本趟最大的 5 已经浮到下标 4,这一格锁定(变绿),以后不再参与比较。
第 2 趟开始。绿色那 1 格是前几趟已经锁定排好的,这一趟只在下标 0 到 3 之间相邻比较。
比相邻的两根:下标 0 是 2,下标 1 是 4。左边 2 不比右边 4 大,不用换。
2 没比 4 大,顺序本来就对,这两根不动,继续往右比下一对。
比相邻的两根:下标 1 是 4,下标 2 是 1。左边 4 比右边 1 大,要交换。
4 比 1 大,两根换位:现在下标 1 是 1,下标 2 是 4。大的那根又往右挪了一步。
比相邻的两根:下标 2 是 4,下标 3 是 3。左边 4 比右边 3 大,要交换。
4 比 3 大,两根换位:现在下标 2 是 3,下标 3 是 4。大的那根又往右挪了一步。
第 2 趟跑完,本趟最大的 4 已经浮到下标 3,这一格锁定(变绿),以后不再参与比较。
第 3 趟开始。绿色那 2 格是前几趟已经锁定排好的,这一趟只在下标 0 到 2 之间相邻比较。
比相邻的两根:下标 0 是 2,下标 1 是 1。左边 2 比右边 1 大,要交换。
2 比 1 大,两根换位:现在下标 0 是 1,下标 1 是 2。大的那根又往右挪了一步。
比相邻的两根:下标 1 是 2,下标 2 是 3。左边 2 不比右边 3 大,不用换。
2 没比 3 大,顺序本来就对,这两根不动,继续往右比下一对。
第 3 趟跑完,本趟最大的 3 已经浮到下标 2,这一格锁定(变绿),以后不再参与比较。
第 4 趟开始。绿色那 3 格是前几趟已经锁定排好的,这一趟只在下标 0 到 1 之间相邻比较。
比相邻的两根:下标 0 是 1,下标 1 是 2。左边 1 不比右边 2 大,不用换。
1 没比 2 大,顺序本来就对,这两根不动,继续往右比下一对。
第 4 趟跑完,本趟最大的 2 已经浮到下标 1,这一格锁定(变绿),以后不再参与比较。
当右边都锁定后,剩下最左边那格自然也就到位了。整排柱子从矮到高排好:[1,2,3,4,5]。
三个高频追问:稳定性、最好/最坏复杂度、以及和选择排序的对比。
参考代码
def bubble_sort(nums): n = len(nums) for i in range(n - 1): # 最多跑 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 return nums复杂度
- 时间:O(n²),最坏要跑 n-1 趟,每趟比较接近 n 次,相乘是平方级
- 空间:O(1),只在原数组里两两交换,不开额外数组
易错点
面试追问把动画讲成自己的话
追问冒泡排序是稳定排序吗?
追问最好情况和最坏情况的时间复杂度分别是多少?
追问冒泡排序和选择排序的区别?
这道题到这就讲完了。动画和文字是同一套思路——别光看,关掉页面自己默写一遍。然后顺着主线继续:
选择排序
简单 · 沿着 排序套路 继续往下推进
把这道题真正学会,再走
图解算法年卡 ¥99 /年
- ✓本题每步动画的吴师兄语音讲解(全站陆续覆盖)
- ✓小欧带 8 步通关训练——追问到不看答案也能写对、能 30 秒讲给面试官听
- ✓学习报告,记录每道题的掌握程度
76k+ GitHub Star · 吴师兄开源图解算法,几十万开发者在看的算法讲解
想成体系刷透这类套路?去图解算法专题