怎么用python实现冒泡排序

发布时间:2022-01-14 15:19:22 作者:iii
来源:亿速云 阅读:150
# 怎么用Python实现冒泡排序

## 目录
1. [算法概述](#算法概述)
2. [基础实现](#基础实现)
3. [优化策略](#优化策略)
4. [复杂度分析](#复杂度分析)
5. [实际应用](#实际应用)
6. [完整代码示例](#完整代码示例)
7. [总结](#总结)

---

## 算法概述
冒泡排序(Bubble Sort)是最基础的排序算法之一,其核心思想是通过**相邻元素的比较和交换**将最大(或最小)的元素逐步"冒泡"到数列的末端。虽然效率不高,但因其实现简单,常被用作教学示例。

### 基本特点
- **稳定排序**:相等元素的相对位置不变
- **原地排序**:不需要额外存储空间
- **时间复杂度**:平均和最坏情况O(n²),最好情况O(n)

---

## 基础实现
以下是Python实现的最基础版本:

```python
def bubble_sort_basic(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]  # 交换元素

执行过程示例

以数组 [5, 3, 8, 6] 为例: 1. 第一轮:[3,5,6,8](8冒泡到最后) 2. 第二轮:[3,5,6,8](6到达正确位置) 3. 第三轮:[3,5,6,8](5就位)


优化策略

基础版本存在不必要的比较操作,可以通过以下方法优化:

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

2. 记录最后交换位置

记录最后一次交换的索引,减少内层循环次数:

def bubble_sort_advanced(arr):
    n = len(arr)
    last_swap = n - 1
    for i in range(n):
        new_swap = -1
        for j in range(0, last_swap):
            if arr[j] > arr[j+1]:
                arr[j], arr[j+1] = arr[j+1], arr[j]
                new_swap = j
        if new_swap == -1:
            break
        last_swap = new_swap

3. 双向冒泡(鸡尾酒排序)

交替进行正向和反向扫描:

def cocktail_sort(arr):
    left, right = 0, len(arr)-1
    while left < right:
        # 正向扫描
        for i in range(left, right):
            if arr[i] > arr[i+1]:
                arr[i], arr[i+1] = arr[i+1], arr[i]
        right -= 1
        
        # 反向扫描
        for j in range(right, left, -1):
            if arr[j-1] > arr[j]:
                arr[j], arr[j-1] = arr[j-1], arr[j]
        left += 1

复杂度分析

版本 最好情况 平均情况 最坏情况 空间复杂度
基础版本 O(n²) O(n²) O(n²) O(1)
提前终止 O(n) O(n²) O(n²) O(1)
记录交换位置 O(n) O(n²) O(n²) O(1)
双向冒泡 O(n) O(n²) O(n²) O(1)

实际应用

虽然冒泡排序在实际工程中较少使用,但在以下场景仍有价值:

  1. 教学演示:理解排序算法的入门案例
  2. 小规模数据:当n<100时性能差异不明显
  3. 特殊硬件:某些嵌入式系统需要极简实现
  4. 算法竞赛:快速实现时的备用方案

与其他排序对比

算法 平均时间复杂度 优势场景
快速排序 O(nlogn) 大规模随机数据
归并排序 O(nlogn) 需要稳定排序
冒泡排序 O(n²) 小规模/基本有序数据

完整代码示例

import random
from typing import List

def bubble_sort(arr: List[int]) -> List[int]:
    """优化后的冒泡排序"""
    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

if __name__ == "__main__":
    # 生成测试数据
    test_data = random.sample(range(1,100), 15)
    print(f"原始数据: {test_data}")
    
    # 排序测试
    sorted_data = bubble_sort(test_data.copy())
    print(f"排序结果: {sorted_data}")
    
    # 验证
    assert sorted_data == sorted(test_data), "排序结果验证失败"

总结

  1. 冒泡排序是理解算法基础的优秀案例
  2. 通过优化可使最好情况达到O(n)时间复杂度
  3. 实际工程中更推荐使用sorted()内置函数
  4. 算法改进思路对学习其他排序算法有启发意义

学习建议:尝试用可视化工具观察排序过程(如Python的matplotlib动画演示),能更直观理解算法工作原理。 “`

注:本文实际约1500字,可通过以下方式扩展: 1. 增加更多优化变体的代码示例 2. 添加复杂度计算的数学推导 3. 插入排序过程的可视化图表 4. 补充与其他算法的基准测试对比数据

推荐阅读:
  1. 冒泡排序的python实现
  2. 关于冒泡排序

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

python

上一篇:怎么在Azure portal上创建Windows虚拟机

下一篇:springboot整合quartz定时任务框架的方法是什么

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》