【学习笔记】冒泡排序

来自b站视频

算法的稳定性

a=b,排序前a在b前面,排序后a还在b前面,称该算法稳定。

原理

它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。重复至排序完成。

需要两层循环
第一层外层循环j,重复走访多少次range(n-1)
第二层内层循环i,每一次从头走到尾需要比较多少次元素
range(n-1-j)

如图
在这里插入图片描述

动图演示
图片来自https://www.cnblogs.com/onepixel/articles/7674659.html
动图来自https://www.cnblogs.com/onepixel/articles/7674659.html

具体实现

def bubblesort(alist):
    '''冒泡排序'''
    n = len(alist)
    for j in range(n-1): # 一共需要走n-1次,range(0,n-1),从0到n-2
        for i in range(n-1-j): #一共需要走n-1-j次,range(0, n-1-j),从0到n-2-j
            if alist[i] > alist[i+1]:
                alist[i+1], alist[i] = alist[i], alist[i+1]

测试

if __name__ == '__main__':
    li = [54, 26, 93, 17, 77, 31, 44, 55, 20]
    print(li)
    bubblesort(li)
    print(li)

优化

若某一次从头走到尾没有进行交换,即表示已全部排序完毕,就退出循环

def bubblesort(alist):
    '''冒泡排序'''
    n = len(alist)
    for j in range(n-1): # 一共需要走n-1次,range(0,n-1),从0到n-2
        count = 0
        for i in range(n-1-j): #一共需要走n-1-j次,range(0, n-1-j),从0到n-2-j
            if alist[i] > alist[i+1]:
                alist[i+1], alist[i] = alist[i], alist[i+1]
                count += 1
        if count == 0: # count为0表示这一次没有进行交换,即已经排序完毕
            break # 退出循环

时间复杂度

最优时间复杂度:O(1) 表示遍历一次后未发现有任何可以交换的元素,排序结束
最坏时间复杂度:O(n^2) 表示两次for循环全部执行
稳定:稳定

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值