用Python写冒泡排序法,首先要知道冒泡排序的原理,在一个列表中顺次拿出两个数据比较大小,将大的往后排将小的往前排,如果一共有n个数据一共需要比较n-1次.
最笨的方法:
list_b=[1,5,9,7,6,3,6,4,4,8,85,69,78,99] #例如有一串数据存放在列表
def bubble(list1): #首先定义一个冒泡排序功能的函数
for i in range(len(list1)): #遍历列表
for j in range(len(list1)-1):
if list1[j+1]<list1[j]: #开始比较
list1[j],list1[j+1]=list1[j+1],list1[j] # 数值交换
print(list1) #打印结果
bubble(list_b) #调用函数
# 结果[1, 3, 4, 4, 5, 6, 6, 7, 8, 9, 69, 78, 85, 99]
其实上个代码多了许多次无用的比较,分析上面代码,其实质是:
第一次比较出最大的数值放在了最后位,
第二次比较出了次大值,放在了倒数第二位,
第三次比较出第三大的数值放在倒数第三位…
既然如此,已经确定数值与位置的数就不需要再去比较了
即第一次比较得出最后一位的数值,比较了n-1次
第二次比较得出次大值放在倒数第二位不必再与最大值进行比较
第三处比较得出第三大值不必与最大值和次大值比较进行比较
所以找出规律,每次比较的次数位n-i-1,为什么不是n-i,因为遍历是从0开始的滴.
优化后的代码:
list_b=[1,5,9,7,6,3,6,4,4,8,85,69,78,99]
def bubble(list1):
for i in range(len(list1)):
for j in range(len(list1)-1-i): # 其他的都不变 只是这里变成了-1-i
if list1[j+1]<list1[j]:
list1[j],list1[j+1]=list1[j+1],list1[j]
print(list1)
bubble(list_b)
#结果还是一样的
还可以立个flag设定一个变量为False,如果元素之间交换了位置,将变量重新赋值为True,最后再判断,在一次循环结束后,变量如果还是为False,则break退出循环.
list_b=[1,5,9,7,6,3,6,4,4,8,85,69,78,99]
def bubble(list1):
for i in range(len(list1) - 1):
flag = False
for j in range(len(list1) - 1 - i):
if list_b[j] > list1[j + 1]:
list1[j], list1[j + 1] = list1[j + 1], list1[j]
flag = True
if not flag:
break
return list1
print(bubble(list_b))