Python冒泡排序算法详解
从基础原理到代码实现,全面掌握冒泡排序
什么是冒泡排序?
冒泡排序(Bubble Sort)是一种简单的排序算法,它重复地遍历要排序的列表,一次比较两个相邻元素,如果它们的顺序错误就把它们交换过来。遍历列表的工作会重复进行,直到列表已经排序完成。
5
1
4
2
8
未排序的数组示例
这个算法的名字由来是因为越小的元素会经由交换慢慢"浮"到数列的顶端(升序排列),就像气泡最终会上浮到水面一样,故名为"冒泡排序"。
冒泡排序算法步骤
- 比较相邻的元素。如果第一个比第二个大(升序排列),就交换它们两个。
- 对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。
- 针对所有的元素重复以上的步骤,除了最后一个。
- 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
排序过程可视化:
第一轮:
5, 1, 4, 2, 8 → 1, 5, 4, 2, 8
1, 5, 4, 2, 8 → 1, 4, 5, 2, 8
1, 4, 5, 2, 8 → 1, 4, 2, 5, 8
1, 4, 2, 5, 8 → 1, 4, 2, 5, 8
第二轮:
1, 4, 2, 5, 8 → 1, 4, 2, 5, 8
1, 4, 2, 5, 8 → 1, 2, 4, 5, 8
1, 2, 4, 5, 8 → 1, 2, 4, 5, 8
第三轮:
1, 2, 4, 5, 8 → 1, 2, 4, 5, 8
1, 2, 4, 5, 8 → 1, 2, 4, 5, 8
Python实现冒泡排序
下面是一个基本的冒泡排序实现:
def bubble_sort(arr):
n = len(arr)
# 遍历所有数组元素
for i in range(n):
# 最后i个元素已经有序,无需再比较
for j in range(0, n-i-1):
# 如果当前元素大于下一个元素,则交换
if arr[j] > arr[j+1]:
arr[j], arr[j+1] = arr[j+1], arr[j]
# 测试冒泡排序
if __name__ == "__main__":
data = [64, 34, 25, 12, 22, 11, 90]
print("排序前数组:", data)
bubble_sort(data)
print("排序后数组:", data)
优化后的冒泡排序
我们可以添加一个标志来优化算法,如果某一轮遍历中没有发生交换,说明数组已经有序,可以提前结束排序:
def optimized_bubble_sort(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
# 测试优化后的冒泡排序
if __name__ == "__main__":
data = [11, 12, 22, 25, 34, 64, 90] # 已部分有序的数组
print("排序前数组:", data)
optimized_bubble_sort(data)
print("排序后数组:", data)
冒泡排序的时间复杂度
最坏情况
O(n²)
当输入数组完全逆序时
平均情况
O(n²)
随机排列的数组
最好情况
O(n)
使用优化方法且数组已有序时
空间复杂度
O(1)
原地排序,仅使用常数空间
冒泡排序的优缺点
优点
- 算法简单,易于理解和实现
- 空间复杂度低(O(1))
- 稳定性好(相同元素相对位置不变)
- 优化后对部分有序数组效率高
缺点
- 平均和最坏情况时间复杂度高(O(n²))
- 不适合大规模数据排序
- 效率低于其他O(n log n)算法
- 交换操作较多
冒泡排序应用场景
尽管冒泡排序在效率上不如快速排序、归并排序等高级算法,但在某些特定场景下仍有其价值:
1
教学目的
作为入门排序算法,帮助理解算法基础
2
小规模数据
数据量较小(n < 100)时效率尚可
3
部分有序数据
优化后对部分有序数组效率较高
学习建议
冒泡排序是学习排序算法的良好起点,理解其原理后可以继续学习更高效的排序算法如:
快速排序
归并排序
堆排序
插入排序
选择排序
发表评论