Python - 冒泡排序

本文详细介绍了冒泡排序的原理,通过具体的排序过程分析冒泡排序的步骤,并使用Python实现了冒泡排序算法,同时总结了冒泡排序的时间复杂度和适用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1 冒泡算法

        冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法,它属于交换排序,主要的方式是通过两辆比较,交换位置,如同水泡咕嘟咕嘟往上冒一样,需要称他为’冒泡排序’。

2 具体的排序方法

        它重复地走访过要排序的元素列,依次比较两个相邻的元素,按照一定的顺序(升序/降序)进行比较,如果是升序,那么当右边的数小于左边的数,那么就会进行交换,直到没有相邻的元素需要交换后停止。此时表示该列元素已经排序完成。

3 分析

        根据定义,我们知道最少需要两个循环,第一个循环遍历所有元素,内层循环则进行两两比较及换位的操作。

升序分析:
初始列表:[9,1,3,2,6,8,7,4,5]
第一趟,第一次:比较9和1的大小情况,9大于1,需要调换位置[1,9,3,2,6,8,7,4,5]
第一趟,第二次:比较9和3的大小情况,9大于3,需要调换位置[1,3,9,2,6,8,7,4,5]
第一趟,第三次:比较9和2的大小情况,9大于2,需要调换位置[1,3,2,9,6,8,7,4,5]
第一趟,第四次:比较9和6的大小情况,9大于6,需要调换位置[1,3,2,6,9,8,7,4,5]
第一趟,第五次:比较9和8的大小情况,9大于8,需要调换位置[1,3,2,6,8,9,7,4,5]
第一趟,第六次:比较9和7的大小情况,9大于7,需要调换位置[1,3,2,6,8,7,9,4,5]
第一趟,第七次:比较9和4的大小情况,9大于4,需要调换位置[1,3,2,6,8,7,4,9,5]
第一趟,第八次:比较9和5的大小情况,9大于5,需要调换位置[1,3,2,6,8,7,4,5,9]
第一趟确定了一个最大数,放在最右边。接下来在除他以外的未排序空间进行第二趟循环,确认第二大的数放在最油边

第二趟初始列表:[1,3,2,6,8,7,4,5,9]
第二趟,第一次:比较1和3的大小情况,1小于3,不用调换位置[1,3,2,6,8,7,4,5,9]
第二趟,第二次:比较3和2的大小情况,3大于2,需要调换位置[1,2,3,6,8,7,4,5,9]
第二趟,第三次:比较3和6的大小情况,3小于6,不用调换位置[1,2,3,6,8,7,4,5,9]
第二趟,第四次:比较6和8的大小情况,6小于8,不用调换位置[1,2,3,6,8,7,4,5,9]
第二趟,第五次:比较8和7的大小情况,8大于7,需要调换位置[1,2,3,6,7,8,4,5,9]
第二趟,第六次:比较8和4的大小情况,8大于4,需要调换位置[1,2,3,6,7,4,8,5,9]
第二趟,第七次:比较8和5的大小情况,8大于5,需要调换位置[1,2,3,6,7,4,5,8,9]
第二趟找到了第二大的书,放在了第一趟找出的最大数的左边。

4 实现

        通过观察可以得知,外层循环每次都可以确定一个最大数,放在最右边,而内层循环,判断的次数是依次减少的,因为上一堂确定的最大数,下一趟就不必再进行对比,根据这个情况编写代码进行排序。

lst = [1,9,3,2,6,8,7,4,5]
length = len(lst)
for i in range(length):
    flag = False          # 退出开关
    for j in range(length - i - 1):
        if lst[j] > lst[j+1]:
            flag = True  # 如果本次交换了位置,开关位置为关
            lst[j], lst[j+1] = lst[j+1], lst[j]
    if not flag:break   # 当开关为开时,表示本次判断没有交换,没有交换,则认为已经排序完毕
print(lst)

5 总结

  • 冒泡法需要数据一轮一轮的比较
  • 可以设定一个标记判断是否有数据交换发生,如果没有发生交换,可以结束排序,因为此时已经排序完毕了,如果发生了交换,那么就需要继续下一轮排序了
  • 最差的排序情况是,出事顺序与目标顺序完全相反,遍历次数1,…n-1之和: n(n-1)/2
  • 最好的排序情况是,初始顺序与目标顺序完全相同,遍历次数n-1
  • 时间复杂度为O(n**2)
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值