Python实现冒泡排序

算法介绍

冒泡排序(Bubble Sort)是最容易理解的排序算法之一,但是运行效率有点低。

冒泡过程:对待排序部分(假设有M个元素)从头开始进行两两比较,如果第一个比第二个大(升序),就交换他们两个。这样本轮排序结束后就可以保证值最大的元素在最右边,那么下次只需要对前面(M-1)个数进行冒泡。

完整的冒泡排序就是进行N-1(N为数列长度)次的冒泡。

代码实现

def bubbleSort(source):
    for i in range(len(source)-1, 0, -1):    # i控制待排序区间的长度
        for j in range(i):                   # 对下标为0到i-1的区域排序
            if source[j] > source[j + 1]:    # 保证值大的元素往后移
                source[j], source[j + 1] = source[j + 1], source[j]
    return source

s = [8,6,13,7,17,1,4,5,2]
print(bubbleSort(s))     
# 输出:  
# [1, 2, 4, 5, 6, 7, 8, 13, 17]

冒泡排序算法还可以进行改进,就是在算法中加入一个布尔变量来记录该轮排序是否产生过数据交换,若在某一轮排序中未发生数据交换,则说明待排序部分已经有序,无需再进行排序。

def bubbleSort_v2(source):
    for i in range(len(source)-1, 0, -1):
        exchange = False  # 记录本轮排序是否产生过数据交换
        for j in range(i):
            if source[j] > source[j + 1]: 
                exchange = True
                source[j], source[j + 1] = source[j + 1], source[j]
        # 如果未发生交换,说明数列已经有序,直接返回
        if not exchange:  
            print('程序于第%d轮结束'%(len(source) - i))
            break
    return source

# 为了检验改进是否有效,我们输入一个有序数列,那么程序应该在排序一轮后就结束。   
s = [1,2,3,4,5,6,7]
print(bubbleSort_v2(s))
# 输出:
# 程序于第1轮结束
# [1,2,3,4,5,6,7]

算法效率分析

最优时间复杂度:O(N) (输入已经有序,一次扫描即可完成排序)
最坏时间复杂度:O(N2)(输入为反序)
平均时间复杂度:O(N2)
空间复杂度:O(1)
稳定性:因为交换的条件是大于(或者小于),故值相等的两个元素的前后顺序不会改变,所以算法稳定。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值