思想:循环一个序列,比较两个相邻的元素,当第一个元素大于第二个元素时,交换两个元素的位置,直到循环到最后一个元素为止;
优化版冒泡排序:
def optimization_bubble(collection):
for i in range(len(collection)):
flag = False
for j in range(len(collection) - i - 1):
if collection[j] > collection[j+1]:
collection[j + 1],collection[j] = collection[j],collection[j + 1]
flag = True
if not flag:
return collection
return collection
优化的地方在于减少循环次数,当排序列表在第二层循环中没有符合条件,就意味着目前的列表已经是排好顺序了,直接返回当前列表就可以了,优化前的冒泡排序则会一层层执行下去,直至第一层循环结束,附上优化前的冒泡排序代码供参考;
原始冒泡排序:
def bubble_sort(collection):
for i in range(len(collection)):
for j in range(len(collection) - i -1):
if collection[j] > collection[j + 1]:
collection[j+1],collection[j] = collection[j],collection[j+1]
return collection
冒泡排序的最优版本又称鸡尾酒排序,也叫双向冒泡排序等等,这是冒泡排序的一种变体,不同之处在于,冒泡排序从低到高序列里的每个元素排序,而鸡尾酒排序从两个方向(低到高,高到底)来回排序,效率更高,代码展示:
def cocktail_shaker_sort(sorted_list):
for i in range(len(sorted_list) - 1, 0, -1):
swapped = False
for j in range(i, 0, -1):
if sorted_list[j] < sorted_list[j - 1]:
sorted_list[j], sorted_list[j - 1] = sorted_list[j - 1], sorted_list[j]
swapped = True
for j in range(i):
if sorted_list[j] > sorted_list[j + 1]:
sorted_list[j], sorted_list[j + 1] = sorted_list[j + 1], sorted_list[j]
swapped = True
if not swapped:
return sorted_list