鸡尾酒排序

222 阅读1分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

鸡尾酒排序

鸡尾酒排序是在冒泡排序的基础上改进得到的,相比于冒泡排序,鸡尾酒排序更适合于大部分元素有序的列表。

冒泡排序是一个单向的运动,每一轮都是从左到右来比较元素,而鸡尾酒排序是每一轮进行两个方向的比较和移动,先从左往右比较确定一个最大值,再从右往左确定一个最小值。相比于冒泡排序可以减少排序的的回合轮数。

范例

列表[54,26,75,2,17,8,40,12,34]

  1. 确定该算法总的排序轮数为len(list)//2
  2. 第一轮第一次排序,从第一个列表元素开始从左到右比较,排出最大值75放在列表最后,第一轮第二次,从倒数第二个元素开始与前一个元素从右向左相比较,排出最小值2放在列表最前面。
  3. 第二轮第一次排序,排出次最大值54,第二轮第二次排序,排出次最小8。
  4. 持续以上步骤,每次需要比较的元素越来越少,直到没有任何一对元素需要比较。
代码

升序

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))
结果

image.png