数据结构与算法-Python实现冒泡排序

算法原理

类似与我们小时候老师给我们排身高的过程,原理图如下:
在这里插入图片描述

时间复杂度

最坏时间复杂度为O(n^2),最优时间复杂度为O(n)。

算法步骤

  1. 比较相邻的元素,如果第一个数值比第二个大,就交换两个元素的位置。
  2. 对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。这步做完之后,最后的元素会是最大的数。
  3. 从头开始重复执行上述的两步,每一次排序得到的最后的大元素不再参与排序。
  4. 直到没有元素需要交换位置时,算法执行结束。

算法实现

def bubble_sort(alist):
    """冒泡排序"""
    n = len(alist)
    for i in range(1,n):
        for j in range(n-i):
            if alist[j]>alist[j+1]:
                alist[j], alist[j+1] = alist[j+1],alist[j]
                
    return alist

对于一个[1,2,3,4,5,6]已经排好序的列表,通过上面的程序时间复杂度仍然是O(n^2),因此上述代码还可以进行一个优化:

def new_bubble_sort(alist):
    """冒泡排序"""
    n = len(alist)
    for i in range(1,n):
        # count用于记录元素交换的次数
        count = 0
        for j in range(n-i):
            if alist[j]>alist[j+1]:
                alist[j], alist[j+1] = alist[j+1],alist[j]
                count += 1
        # 当count为0时,没有进行过交换操作,列表是天然顺序的
        if count==0:
            break
    return alist

此时的时间复杂度为O(n)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值