当前位置:首页 > Python > 正文

Python冒泡排序算法详解 - 从原理到代码实现 | 算法教程

Python冒泡排序算法详解

从基础原理到代码实现,全面掌握冒泡排序

什么是冒泡排序?

冒泡排序(Bubble Sort)是一种简单的排序算法,它重复地遍历要排序的列表,一次比较两个相邻元素,如果它们的顺序错误就把它们交换过来。遍历列表的工作会重复进行,直到列表已经排序完成。

5
1
4
2
8
未排序的数组示例

这个算法的名字由来是因为越小的元素会经由交换慢慢"浮"到数列的顶端(升序排列),就像气泡最终会上浮到水面一样,故名为"冒泡排序"。

冒泡排序算法步骤

  1. 比较相邻的元素。如果第一个比第二个大(升序排列),就交换它们两个。
  2. 对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。
  3. 针对所有的元素重复以上的步骤,除了最后一个。
  4. 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

排序过程可视化:

第一轮:
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

部分有序数据

优化后对部分有序数组效率较高

学习建议

冒泡排序是学习排序算法的良好起点,理解其原理后可以继续学习更高效的排序算法如:

快速排序 归并排序 堆排序 插入排序 选择排序

发表评论