冒泡排序(Bubble Sort)是最基础的排序算法之一,通常用于学习排序算法的入门理解。本文将通过 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]
return arr
# 示例
arr = [64, 34, 25, 12, 22, 11, 90]
print('bubble_sorted:', bubble_sort(arr))
外层循环 for i in range(n)
表示总共进行 n 轮冒泡。
内层循环 for j in range(0, n - i - 1)
逐渐减少比较次数,因为每轮结束后,末尾已是有序的最大值。
条件判断 if arr[j] > arr[j + 1]
是核心逻辑,若顺序错误就交换两个数。
以数组 [5, 3, 8, 4]
为例:
比较 5 和 3 → 交换 [3, 5, 8, 4]
比较 5 和 8 → 无需交换
比较 8 和 4 → 交换 [3, 5, 4, 8]
比较 3 和 5 → 无需交换
比较 5 和 4 → 交换 [3, 4, 5, 8]
比较 3 和 4 → 无需交换
最终结果:[3, 4, 5, 8]
情况 | 时间复杂度 | 说明 |
---|---|---|
最好情况 | O(n²) | 没有优化时依然要遍历两层 |
最坏情况 | O(n²) | 完全逆序,最多比较和交换次数 |
平均情况 | O(n²) | 大多数情况下都需交换 |
若加入
flag
标志变量检测是否交换,则最好情况可优化为 O(n)。
空间复杂度:O(1),属于原地排序。
稳定性:稳定排序(相等元素相对位置不变)。
冒泡排序虽然不适合处理大规模数据,但适用于:
学习排序逻辑
小规模数据
对排序稳定性有要求的简单任务
可以引入一个标志位 swapped
来记录本轮是否发生了交换,如果某一轮没有交换,则说明数组已是有序的:
def bubble_sort_optimized(arr):
n = len(arr)
for i in range(n):
swapped = False
for j in range(0, n - i - 1):
if arr[j] > arr[j + 1]:
arr[j], arr[j + 1] = arr[j + 1], arr[j]
swapped = True
if not swapped:
break
return arr
冒泡排序是一种简单但不高效的排序算法,作为入门学习非常合适。在实际项目中,建议使用快速排序、归并排序或 Python 内置的 sort()
,但理解冒泡排序对于掌握更复杂的排序算法非常重要。