首页 > 编程语言 >python-冒泡排序

python-冒泡排序

时间:2024-07-09 18:02:40浏览次数:17  
标签:python list 位置 交换 冒泡排序 num 排序 比较

冒泡排序

1. 功能实现

"""
冒泡排序
	概述:
		是一种交换排序, 相邻两个数比较, 如果前面的数比后面的数大, 就交换位置(由小到大排序时)
	简介:
		在冒泡排序过程中, 每一轮比较出一个最大的数放在队列的最后, 若使用m表示元素的总数, 那么每次冒泡排序需要执行 m-1 轮; n表示已经进行过的轮数, 则每轮需要比较 m-n-1 次, 所以冒泡排序的平均时间复杂度和最坏时间复杂度都是O(n²)
	优点:
		稳定, 空间复杂度低, 简单易懂
"""
def bubbleSort(num_list):
    # 外层for循环控制要比较的轮数, 共需要执行 "长度-1" 次
    for i in range(len(num_list) - 1):
        # 内层for循环控制每一轮要比较的次数, 共需要执行 "长度-已执行的轮数-1" 次
        for j in range(len(num_list) - i - 1):
            print(f'第 {i + 1} 轮 第 {j + 1} 次 比较', end='\t')
            # 如果前面的数比后面的数大, 就交换位置
            if num_list[j] > num_list[j + 1]:
                print(f'{num_list[j]} 和 {num_list[j + 1]} 交换位置', end='')
                num_list[j], num_list[j + 1] = num_list[j + 1], num_list[j]
            else:
                print(f'{num_list[j]} 和 {num_list[j + 1]} 不交换位置', end='')
            print(num_list)
        print(f'第 {i + 1} 轮排序结果: {num_list}')


if __name__ == '__main__':

    num_list = [7, 6, 3, 9, 1, 8]
    print(f'排序前的数组顺序: {num_list}')
    bubbleSort(num_list)
    print(f'排序后的数组顺序: {num_list}')

控制台输出

排序前的数组顺序: [7, 6, 3, 9, 1, 8]
第 1 轮 第 1 次 比较	7 和 6 交换位置[6, 7, 3, 9, 1, 8]
第 1 轮 第 2 次 比较	7 和 3 交换位置[6, 3, 7, 9, 1, 8]
第 1 轮 第 3 次 比较	7 和 9 不交换位置[6, 3, 7, 9, 1, 8]
第 1 轮 第 4 次 比较	9 和 1 交换位置[6, 3, 7, 1, 9, 8]
第 1 轮 第 5 次 比较	9 和 8 交换位置[6, 3, 7, 1, 8, 9]
第 1 轮排序结果: [6, 3, 7, 1, 8, 9]
第 2 轮 第 1 次 比较	6 和 3 交换位置[3, 6, 7, 1, 8, 9]
第 2 轮 第 2 次 比较	6 和 7 不交换位置[3, 6, 7, 1, 8, 9]
第 2 轮 第 3 次 比较	7 和 1 交换位置[3, 6, 1, 7, 8, 9]
第 2 轮 第 4 次 比较	7 和 8 不交换位置[3, 6, 1, 7, 8, 9]
第 2 轮排序结果: [3, 6, 1, 7, 8, 9]
第 3 轮 第 1 次 比较	3 和 6 不交换位置[3, 6, 1, 7, 8, 9]
第 3 轮 第 2 次 比较	6 和 1 交换位置[3, 1, 6, 7, 8, 9]
第 3 轮 第 3 次 比较	6 和 7 不交换位置[3, 1, 6, 7, 8, 9]
第 3 轮排序结果: [3, 1, 6, 7, 8, 9]
第 4 轮 第 1 次 比较	3 和 1 交换位置[1, 3, 6, 7, 8, 9]
第 4 轮 第 2 次 比较	3 和 6 不交换位置[1, 3, 6, 7, 8, 9]
第 4 轮排序结果: [1, 3, 6, 7, 8, 9]
第 5 轮 第 1 次 比较	1 和 3 不交换位置[1, 3, 6, 7, 8, 9]
第 5 轮排序结果: [1, 3, 6, 7, 8, 9]
排序后的数组顺序: [1, 3, 6, 7, 8, 9]

1.1 发现问题

"""
	发现问题:
		当传入该序列时, 传入的序列在第一轮比较后, 排序就已经完成, 但是由于冒泡排序的总轮数未结束, 所以会继续比较下去, 浪费了资源 
	解决问题:
		可以在每一轮比较开始前设置一个标记, 如果交换位置则改变标记值, 每轮比较结束后判断标记是否被改变: 如果没有改变说明本轮比较未发生位置交换, 则排序结束
"""
if __name__ == '__main__':

	num_list = [6, 1, 2, 3, 4, 5]
	print(f'排序前的数组顺序: {num_list}')
    bubbleSort(num_list)
    print(f'排序后的数组顺序: {num_list}')

控制台输出

排序前的数组顺序: [6, 1, 2, 3, 4, 5]
第 1 轮 第 1 次 比较	6 和 1 交换位置[1, 6, 2, 3, 4, 5]
第 1 轮 第 2 次 比较	6 和 2 交换位置[1, 2, 6, 3, 4, 5]
第 1 轮 第 3 次 比较	6 和 3 交换位置[1, 2, 3, 6, 4, 5]
第 1 轮 第 4 次 比较	6 和 4 交换位置[1, 2, 3, 4, 6, 5]
第 1 轮 第 5 次 比较	6 和 5 交换位置[1, 2, 3, 4, 5, 6]
第 1 轮排序结果: [1, 2, 3, 4, 5, 6]
第 2 轮 第 1 次 比较	1 和 2 不交换位置[1, 2, 3, 4, 5, 6]
第 2 轮 第 2 次 比较	2 和 3 不交换位置[1, 2, 3, 4, 5, 6]
第 2 轮 第 3 次 比较	3 和 4 不交换位置[1, 2, 3, 4, 5, 6]
第 2 轮 第 4 次 比较	4 和 5 不交换位置[1, 2, 3, 4, 5, 6]
第 2 轮排序结果: [1, 2, 3, 4, 5, 6]
第 3 轮 第 1 次 比较	1 和 2 不交换位置[1, 2, 3, 4, 5, 6]
第 3 轮 第 2 次 比较	2 和 3 不交换位置[1, 2, 3, 4, 5, 6]
第 3 轮 第 3 次 比较	3 和 4 不交换位置[1, 2, 3, 4, 5, 6]
第 3 轮排序结果: [1, 2, 3, 4, 5, 6]
第 4 轮 第 1 次 比较	1 和 2 不交换位置[1, 2, 3, 4, 5, 6]
第 4 轮 第 2 次 比较	2 和 3 不交换位置[1, 2, 3, 4, 5, 6]
第 4 轮排序结果: [1, 2, 3, 4, 5, 6]
第 5 轮 第 1 次 比较	1 和 2 不交换位置[1, 2, 3, 4, 5, 6]
第 5 轮排序结果: [1, 2, 3, 4, 5, 6]
排序后的数组顺序: [1, 2, 3, 4, 5, 6]

2. 算法优化 1

def bubbleSortOptimize1(num_list):
    # 外层for循环控制要比较的轮数, 共需要执行 "长度-1"
    for i in range(len(num_list) - 1):
        # 设置标记
        sorted = True
        # 内层for循环控制每一轮要比较的次数, 共需要执行 "长度-已执行的轮数-1" 次
        for j in range(len(num_list) - i - 1):
            print(f'第 {i + 1} 轮 第 {j + 1} 次 比较', end='\t')
            # 如果前面的数比后面的数大, 就交换位置
            if num_list[j] > num_list[j + 1]:
                print(f'{num_list[j]} 和 {num_list[j + 1]} 交换位置', end='')
                num_list[j], num_list[j + 1] = num_list[j + 1], num_list[j]
                # 发生位置交换, 说明排序未结束
                sorted = False
            else:
                print(f'{num_list[j]} 和 {num_list[j + 1]} 不交换位置', end='')
            print(num_list)
        print(f'第 {i + 1} 轮排序结果: {num_list}')
        # 本轮位置未发生交换, 说明排序完成, 结束循环
        if sorted:
            return


if __name__ == '__main__':

	num_list = [6, 1, 2, 3, 4, 5]
	print(f'排序前的数组顺序: {num_list}')
    bubbleSortOptimize1(num_list)
    print(f'排序后的数组顺序: {num_list}')

控制台输出

排序前的数组顺序: [6, 1, 2, 3, 4, 5]
第 1 轮 第 1 次 比较	6 和 1 交换位置[1, 6, 2, 3, 4, 5]
第 1 轮 第 2 次 比较	6 和 2 交换位置[1, 2, 6, 3, 4, 5]
第 1 轮 第 3 次 比较	6 和 3 交换位置[1, 2, 3, 6, 4, 5]
第 1 轮 第 4 次 比较	6 和 4 交换位置[1, 2, 3, 4, 6, 5]
第 1 轮 第 5 次 比较	6 和 5 交换位置[1, 2, 3, 4, 5, 6]
第 1 轮排序结果: [1, 2, 3, 4, 5, 6]
第 2 轮 第 1 次 比较	1 和 2 不交换位置[1, 2, 3, 4, 5, 6]
第 2 轮 第 2 次 比较	2 和 3 不交换位置[1, 2, 3, 4, 5, 6]
第 2 轮 第 3 次 比较	3 和 4 不交换位置[1, 2, 3, 4, 5, 6]
第 2 轮 第 4 次 比较	4 和 5 不交换位置[1, 2, 3, 4, 5, 6]
第 2 轮排序结果: [1, 2, 3, 4, 5, 6]
排序后的数组顺序: [1, 2, 3, 4, 5, 6]

2.1 发现问题

"""
发现问题:
	通过分析执行结果, 在执行第一轮比较时, 从第三次比较开始便未发生任何位置交换, 说明后面的顺序已经排好了, 但是在第二轮比较时, 依然进行了后面的比较
解决问题:
	记录下最后一次发生位置交换的位置, 作为下一轮比较的最后位置
"""
if __name__ == '__main__':
    
    num_list = [1, 3, 2, 4, 5, 6]
    print(f'排序前的数组顺序: {num_list}')
    bubbleSortOptimize1(num_list)
    print(f'排序后的数组顺序: {num_list}')

控制台输出

排序前的数组顺序: [1, 3, 2, 4, 5, 6]
第 1 轮 第 1 次 比较	1 和 3 不交换位置[1, 3, 2, 4, 5, 6]
第 1 轮 第 2 次 比较	3 和 2 交换位置[1, 2, 3, 4, 5, 6]
第 1 轮 第 3 次 比较	3 和 4 不交换位置[1, 2, 3, 4, 5, 6]
第 1 轮 第 4 次 比较	4 和 5 不交换位置[1, 2, 3, 4, 5, 6]
第 1 轮 第 5 次 比较	5 和 6 不交换位置[1, 2, 3, 4, 5, 6]
第 1 轮排序结果: [1, 2, 3, 4, 5, 6]
第 2 轮 第 1 次 比较	1 和 2 不交换位置[1, 2, 3, 4, 5, 6]
第 2 轮 第 2 次 比较	2 和 3 不交换位置[1, 2, 3, 4, 5, 6]
第 2 轮 第 3 次 比较	3 和 4 不交换位置[1, 2, 3, 4, 5, 6]
第 2 轮 第 4 次 比较	4 和 5 不交换位置[1, 2, 3, 4, 5, 6]
第 2 轮排序结果: [1, 2, 3, 4, 5, 6]
排序后的数组顺序: [1, 2, 3, 4, 5, 6]

3. 算法优化 2

"""
进行两次冒泡排序优化:
	第一次 优化比较的轮数, 即减少外层for循环执行次数
	第二次 优化某一轮比较的次数, 即减少了内层for循环执行的次数
"""
def bubbleSortOptimize2(num_list):
    inner = range(len(num_list) - 1)
    # 外层for循环控制要比较的轮数, 共需要执行 "长度-1"
    for i in range(len(num_list) - 1):
        # 设置标记
        sorted = True
        # 内层for循环控制每一轮要比较的次数
        for j in inner:
            print(f'第 {i + 1} 轮 第 {j + 1} 次 比较', end='\t')
            # 如果前面的数比后面的数大, 就交换位置
            if num_list[j] > num_list[j + 1]:
                print(f'{num_list[j]} 和 {num_list[j + 1]} 交换位置', end='')
                num_list[j], num_list[j + 1] = num_list[j + 1], num_list[j]
                # 发生位置交换, 说明排序未结束
                sorted = False
                # 记录一下最后交换的位置
                last_change = j
            else:
                print(f'{num_list[j]} 和 {num_list[j + 1]} 不交换位置', end='')
            print(num_list)
        print(f'第 {i + 1} 轮排序结果: {num_list}')
        # 本轮位置未发生交换, 说明排序完成, 结束循环
        if sorted:
            return
        print(f'最后交换的位置: {last_change}')
        # 改变下一轮比较的范围
        inner = range(last_change)


if __name__ == '__main__':

    num_list = [1, 3, 2, 4, 5, 6]
    print(f'排序前的数组顺序: {num_list}')
    bubbleSortOptimize2(num_list)
    print(f'排序后的数组顺序: {num_list}')

控制台输出

排序前的数组顺序: [1, 3, 2, 4, 5, 6]
第 1 轮 第 1 次 比较	1 和 3 不交换位置[1, 3, 2, 4, 5, 6]
第 1 轮 第 2 次 比较	3 和 2 交换位置[1, 2, 3, 4, 5, 6]
第 1 轮 第 3 次 比较	3 和 4 不交换位置[1, 2, 3, 4, 5, 6]
第 1 轮 第 4 次 比较	4 和 5 不交换位置[1, 2, 3, 4, 5, 6]
第 1 轮 第 5 次 比较	5 和 6 不交换位置[1, 2, 3, 4, 5, 6]
第 1 轮排序结果: [1, 2, 3, 4, 5, 6]
最后交换的位置: 1
第 2 轮 第 1 次 比较	1 和 2 不交换位置[1, 2, 3, 4, 5, 6]
第 2 轮排序结果: [1, 2, 3, 4, 5, 6]
排序后的数组顺序: [1, 2, 3, 4, 5, 6]

标签:python,list,位置,交换,冒泡排序,num,排序,比较
From: https://blog.csdn.net/h15366059/article/details/140301450

相关文章

  • window环境下安装和切换两个python环境
    1.在python官网下载python3.0版本的安装包,并安装python,安装好后,在cmd终端输入python--version查看是否安装成功:如图显示python版本号后,表示安装成功。2.此时下载python2.6或者2.7版本,安装python2.0版本是因为部分软件需要低版本的python环境,没比如sqlmap软件,在官网下载python......
  • 【融合ChatGPT等AI模型】Python-GEE遥感云大数据分析、管理与可视化
    随着航空、航天、近地空间遥感平台的持续发展,遥感技术近年来取得显著进步。遥感数据的空间、时间、光谱分辨率及数据量均大幅提升,呈现出大数据特征。这为相关研究带来了新机遇,但同时也带来巨大挑战。传统的工作站和服务器已无法满足大区域、多尺度海量遥感数据处理需求。为解......
  • 【Python迭代器探秘】:揭秘迭代器与生成器的魔法,掌握高效循环的艺术
    文章目录一、迭代器的基本概念1.1迭代器优点1.2迭代器的编写方法1.3python内置迭代器函数1.4小结1.5迭代器对象与迭代对象1.5.1区别1.迭代对象2.迭代器对象3.小结1.5.2方法区分二、生成器基本概念1.生成器函数2.生成器表达式一、迭代器的基本概念......
  • 【goreplay】python简单使用goreplay中间件功能
    一、场景   流量录制,需要对播放的流量进程定制化处理,那么可以使用中间件来实现  二、官网https://pypi.org/project/gor/  三、编写中间件代码#coding:utf-8importsysfromgor.middlewareimportAsyncioGordefon_request(proxy,msg,**kwargs):......
  • 1 python介绍、基本语法、流程控制
     一、Python介绍python的创始人为吉多·范罗苏姆(GuidovanRossum)。1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC语言的一种继承。  最新的TIOBE排行榜,Python赶超PHP占据第五, Python崇尚优美、清晰、简单,是......
  • 【Python】Word文档操作
     一、全文替换不是创建word文档写入内容,而是基于现有的Word文档进行替换处理使用run.text直接赋值修改发现样式会丢失,而网上大部分办法都是这么写的...直到我看到这篇文章的评论:https://blog.csdn.net/qq_40222956/article/details/106098464 除了段落替换后,Word文档......
  • Python酷库之旅-第三方库Pandas(012)
    目录一、用法精讲28、pandas.HDFStore.keys函数28-1、语法28-2、参数28-3、功能28-4、返回值28-5、说明28-6、用法28-6-1、数据准备28-6-2、代码示例28-6-3、结果输出29、pandas.HDFStore.groups函数29-1、语法29-2、参数29-3、功能29-4、返回值29-5、说明29......
  • Python实战训练(方程与拟合曲线)
    1.方程求e^x-派(3.14)的解用二分法来求解,先简单算出解所在的区间,然后用迭代法求逼近解,一般不能得到精准的解,所以设置一个能满足自己进度的标准来判断解是否满足这里打印出解x0是因为在递归过程中没有变量去接收返回值,所以返回x0,再打印x0得到的是None,再用numpy自带的log(pi)就查......
  • 爆赞!GitHub首本Python开发实战背记手册,标星果然百万名不虚传
    Python (发音:['paiθ(ə)n;(US)'paiθɔn]n.蟒蛇,巨蛇),是一种面向对象的解释性的计算机程序设计语言,也是一种功能强大而完善的通用型语言,已经具有十多年的发展历史,成熟且稳定。Python具有脚本语言中最丰富和强大的类库,足以支持绝大多数日常应用。Python语言的特点......
  • C#将文件以byte[]形式传给python的sanic接口
    C#如何将文件以byte[]形式传给python的sanic接口?C#调用的部分你可以按照以下步骤进行:1)读取文件,将文件转换成byte[];2)定义类,将byte[]内容转成json格式传输;3)使用post请求将content传输到接口,返回结果;C#调用部分代码:/*将文件转换成byte[]格式*/protectedstaticbyte[]GetFileD......