你有没有试过整理一堆杂乱的成绩单,从低到高排好?如果每次只比较相邻两个数,大的往后挪,小的往前移,重复几轮后,整个列表就有序了。这个过程,就是冒泡排序的核心思路。
它是怎么“冒泡”的?
名字听起来挺有趣,其实很形象。每一轮比较中,最大的那个数会像水中的气泡一样,慢慢地“浮”到最右边。下一轮再对剩下的数做同样的事,直到全部排好。
举个例子,有数组 [5, 3, 8, 4, 2]。第一轮从头开始两两比较:
- 5 和 3 比,5 大,交换 → [3, 5, 8, 4, 2]
- 5 和 8 比,5 小,不换 → [3, 5, 8, 4, 2]
- 8 和 4 比,8 大,交换 → [3, 5, 4, 8, 2]
- 8 和 2 比,8 大,交换 → [3, 5, 4, 2, 8]
这一轮结束,最大的数 8 已经“冒”到最后。下一轮继续对前四个数操作,重复这个过程。
代码长什么样?
用 Python 写一个简单的冒泡排序,看起来是这样的:
def bubble_sort(arr):
n = len(arr)
for i in range(n):
for j in range(0, n - i - 1):
if arr[j] > arr[j + 1]:
arr[j], arr[j + 1] = arr[j + 1], arr[j]
# 使用示例
nums = [5, 3, 8, 4, 2]
bubble_sort(nums)
print(nums) # 输出 [2, 3, 4, 5, 8]
外层循环控制轮数,内层循环做相邻比较。每次把当前最大的数“推”到正确位置。
效率怎么样?
它简单易懂,适合教学和小数据量场景。但要是数据多了,比如上千个数字,它的速度就明显慢了。因为最坏情况下要比较 n² 次,属于时间复杂度较高的算法。
就像你用手一一对比几十本书的厚度来排序,能完成,但不如找个更聪明的办法快。
尽管如此,在某些特定条件下,比如数据几乎已经有序时,加个标志位优化,它可以提前结束,效率也能提升不少。