趣学Python算法100例】冒泡排序

问题描述

对N个整数(数据由键盘输入)进行升序排列。

问题分析

要整理一组相同类型的数,我们可以用一个叫数组的工具来存放它们。冒泡排序,就是通过一次次比较相邻的两个数并交换位置,让原本乱糟糟的数组变得井井有条。

具体怎么操作呢?首先,从数组的第一个数开始,一个接一个地往后看,每看到两个相邻的数,就比比谁大谁小。如果前面的数比后面的数大,我们就把它们俩换个位置,就像把不听话的小朋友往后挪一样,这样就消除了一处混乱。一边往后走,我们一边持续做这个"大数往后靠"的动作,最终,最大的数就会被推到数组的最后边,正合适。接着,我们忽略掉刚刚找到的最大数,对剩下的数重复刚才的步骤,再把第二大的数放到倒数第二个位置。就这么一遍遍重复,直到整个数组都排好队,最小的数在前,最大的数在后。

假如数组里总共有n个数,在最糟糕的情况下,我们需要做的比较次数会像这样增加:(n-1)加上(n-2),一直加到1。数学上一算,总共得比较n(n-1)/2次。

算法设计

冒泡排序嘛,想象一下这样的画面,就像吹泡泡,大的泡泡会慢慢浮到上面,小的沉下去,过程挺直观的,画个图就更一目了然了,就像下图那样。从头到尾看这个排序过程,你会发现一个规律,就是如果有一堆数字(比如说n个)要排序,你只需要比较n-1回就够了。拿7个数字来打个比方,要把它们排好队,其实只要比较6轮就能搞定,每次比较完,最大的数就会像泡泡一样浮到最后。图里那些加粗的数字,就是每轮比较后位置固定、不会再动的数了。

完整的程序

程序流程图如下图所示:

根据上面的分析,编写程序如下:

python 复制代码
def bubbleSort(a):
    """
    使用冒泡排序算法对列表a进行升序排序。
    
    参数:
    a (list): 待排序的整数列表。
    
    返回:
    list: 排序后的列表。
    """
    # 首先获取列表的总长度,为之后循环比较做准备
    n = len(a)
    
    # 检查输入是否为列表
    if not isinstance(a, list):
        raise ValueError("输入必须是一个列表")
    
    # 检查列表中的元素是否都是可比较的类型
    if not all(isinstance(x, (int, float)) for x in a):
        raise ValueError("列表中的所有元素必须是整数或浮点数")
    
    # 进行 n-1 次比较,控制比较的轮数
    i = 1
    while i <= n-1:
        # 控制每轮比较的次数
        j = 0
        while j < n-i:
            # 交换
            if a[j] > a[j+1]:
                t = a[j]
                a[j] = a[j+1]
                a[j+1] = t
            j += 1
        i += 1
    
    # 返回排序后的列表
    return a


if __name__=="__main__":
    print("请为列表元素赋初值,列表末尾不能有空格:")
    x = input()
    a = x.split(" ")                        # 以空格方式分割每个元素
    for i in range(0, len(a)):              # 输入多个值
        a[i] = int(a[i])
    print("你输入的列表元素为:\n", a)
    print("经过交换后的数组元素为:\n",bubbleSort(a))
    

运行结果

在VSCode里面启动你的程序时,它会友好地提醒你:"记得给数组的每个小格子填上初始值哦,还有,结尾处不要留下空格哟。"接下来,你只要输入两组不一样的初始数值,程序就会欢快地跑起来,最后展示给你的结果就像下图那样清晰明了。

相关推荐
weixin_307779132 小时前
C++代码实现MATLAB中的dlarray函数功能
开发语言·c++·算法·matlab
海绵宝宝转agent5 小时前
learn-claude-code第1-5章开源学习笔记分享
人工智能·笔记·python·学习
小奇不哭6 小时前
ROS2 单节点,RGB-D 深度相机局部路径提取 + B 样条平滑路径 + YOLOv8 障碍物检测 + 深度测距,用于移动机器人视觉局部循迹。
python·yolov8·ros2·cv2·路径探索循迹
小小龙学IT6 小时前
Python scikit-learn 机器学习库深度解析
python·机器学习·scikit-learn
2601_962071576 小时前
类变量和全局变量的查找路径有什么区别?
开发语言·python
hetao17338377 小时前
2026-10-03~04 hetao1733837 的刷题记录
c++·算法
卷无止境7 小时前
独立开发者的"富矿地带":哪些垂直领域值得你押注一辈子?
后端·python
Java后端的Ai之路7 小时前
Python进阶探索29_eval内置函数
开发语言·python·探索·eval·内置函数
计算机毕业编程指导师7 小时前
计算机毕设选题推荐:基于Hadoop与Spark的Steam游戏数据分析系统源码 毕业设计 选题推荐 毕设选题 数据分析 机器学习 深度学习
大数据·hadoop·python·计算机·spark·毕业设计·steam游戏
计算机毕业编程指导师8 小时前
【计算机毕设选题推荐】基于Hadoop+Spark的白鹿抖音评论大数据分析与可视化系统源码 毕业设计 选题推荐 毕设选题 数据分析 机器学习 深度学习
大数据·hadoop·python·计算机·spark·毕业设计·抖音评论