冒泡排序的基本思想我就不多说,用四个字总结就是《两两交换》。
基本代码:需要交换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)
通过交换次数可见,每次优化都能减少相关的交换次数,证明这是可行方案。