小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
鸡尾酒排序
鸡尾酒排序是在冒泡排序的基础上改进得到的,相比于冒泡排序,鸡尾酒排序更适合于大部分元素有序的列表。
冒泡排序是一个单向的运动,每一轮都是从左到右来比较元素,而鸡尾酒排序是每一轮进行两个方向的比较和移动,先从左往右比较确定一个最大值,再从右往左确定一个最小值。相比于冒泡排序可以减少排序的的回合轮数。
范例
列表[54,26,75,2,17,8,40,12,34]
- 确定该算法总的排序轮数为
len(list)//2。 - 第一轮第一次排序,从第一个列表元素开始从左到右比较,排出最大值75放在列表最后,第一轮第二次,从倒数第二个元素开始与前一个元素从右向左相比较,排出最小值2放在列表最前面。
- 第二轮第一次排序,排出次最大值54,第二轮第二次排序,排出次最小8。
- 持续以上步骤,每次需要比较的元素越来越少,直到没有任何一对元素需要比较。
代码
升序
def cock_tail_sort_up(list):
for i in range(len(list)//2):
for j in range(i,len(list)-i-1):
if list[j]>list[j+1]:
list[j+1],list[j]=list[j],list[j+1]
for k in range(len(list)-i-1,i,-1):
if list[k]<list[k-1]:
list[k],list[k-1]=list[k-1],list[k]
return list
降序
def cock_tail_sort_down(list):
for i in range(len(list)//2):
for j in range(i,len(list)-i-1):
if list[j]<list[j+1]:
list[j+1],list[j]=list[j],list[j+1]
for k in range(len(list)-i-1,i,-1):
if list[k]>list[k-1]:
list[k],list[k-1]=list[k-1],list[k]
return list
list = [54,26,75,2,17,8,40,12,34]
print(cock_tail_sort_up(list))
print(cock_tail_sort_down(list))