冒泡排序从基础到优化python

冒泡排序的基本思想我就不多说,用四个字总结就是《两两交换》。

基本代码:需要交换28次,不知道是不是数据比较小导致排序时间计算不到还是什么原因时间一栏为0.

import time
start = time.time()
li = [3,4,2,1,5,6,7,8]
print('排序前:%s'%li)
len_li = len(li)
count = 0#统计交换次数
for i in range(len_li):
    for j in range(len_li-i-1):
        count += 1
        if li[j]>li[j+1]:
            li[j],li[j+1] = li[j+1],li[j]
    print('第%d次遍历%s'%(i,li))
end = time.time()
print('排序后:%s'%li)
print(count)
print(end-start)

在这里插入图片描述

第一次优化:加入一个flag做是否发生交换判断

import time
start = time.time()
li = [3,4,2,1,5,6,7,8]
print('排序前:%s'%li)
len_li = len(li)
count = 0
for i in range(len_li):
    flag = False#是否发生交换的旗帜flag,发生交换就变True,通过flag来判断交换发生与否
    for j in range(len_li-i-1):
        count += 1
        if li[j]>li[j+1]:
            li[j],li[j+1] = li[j+1],li[j]
            flag = True
    print('第%d次遍历%s'%(i,li))
    if flag == False:
        break
end = time.time()
print(count)
print(end-start)

在这里插入图片描述

第二次优化:在第二次的基础上,对于交换之后已经有序的数据不再进行判断的优化

import time
start = time.time()
li = [3,4,2,1,5,6,7,8]
print('排序前:%s'%li)
len_li = len(li)
count = 0#统计次数
change_last = 0#最后一个交换元素的位置
mid_border = len_li-1#有序和无序的边界
for i in range(len_li):
    flag = False#数据交换旗帜
    for j in range(mid_border):
        count += 1
        if li[j]>li[j+1]:
            li[j],li[j+1] = li[j+1],li[j]
            flag = True
            change_last = j
    print('第%d次遍历%s'%(i,li))
    if flag == False:
        break
    mid_border = change_last
end = time.time()
print(count)
print(end-start)

在这里插入图片描述

通过交换次数可见,每次优化都能减少相关的交换次数,证明这是可行方案。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值