鸡尾酒排序Cocktail Sort

鸡尾酒排序,也就是定向冒泡排序鸡尾酒搅拌排序搅拌排序(也可以视作选择排序的一种变形),涟漪排序来回排序or 快乐小时排序,是冒泡排序的一种变形。此算法与冒泡排序的不同处在于排序时是以双向在序列中进行排序。
 

理解

还是以a=[12,25,5,13,21,37]为例 第1轮:
1.[12,25,5,13,21,37]--a[0]=12与a[1]=25比较-->[12,25,5,13,21,37]
2.[12,25,5,13,21,37]--a[1]=25与 a[2]= 5比较-->[12,5,25,13,21,37]
3.[12,5,25,13,21,37]--a[2]=25与a[3]=13比较-->[12,5,13,25,21,37]
4.[12,5,13,25,21,37]--a[3]=25与a[4]=21比较-->[12,5,13,21,25,37]
5.[12,5,13,21,25,37]--a[4]=25与a[5]=37比较-->[12,5,13,21,25,37]
6.[12,5,13,21,25,37]--a[4]=25与a[3]=21比较-->[12,5,13,21,25,37]
7.[12,5,13,21,25,37]--a[3]=21与a[2]=13比较-->[12,5,13,21,25,37]
8.[12,5,13,21,25,37]--a[2]=13与 a[1]= 5比较-->[12,5,13,21,25,37]
9.[12,5,13,21,25,37]-- a[1]= 5与a[0]=12比较-->[5,12,13,21,25,37]
第1轮即排序完成,可设置标志位,若某1轮来回没有一次交换,即排序结束。

 

Python代码

def cocktail_sort(array):
    length=len(array)
    for i in range(length//2): #每一轮来回,只需冒泡排序的一半
        #每一轮后,都会除去开头和结尾两个元素,最小最大在开头和结尾
        for j in range(i,length-1-i): #从开头到结尾
            if array[j]>array[j+1]: 
                array[j],array[j+1]=array[j+1],array[j]
        for k in range(length-2-i,i,-1): #从倒数第二个数到开头第二个数
            if array[k]<array[k-1]:
                array[k],array[k-1]=array[k-1],array[k]
    return array

if __name__ == '__main__':
    array=[12,25,5,13,21,37]
    print(cocktail_sort(array))

结果
[5, 12, 13, 21, 25, 37]

加上打印函数,看看比较过程

def cocktail_sort(array):
    length=len(array)
    for i in range(length//2):
        for j in range(i,length-1-i):
            if array[j]>array[j+1]:
                print("a[%s] a[%s]比较" %(j,j+1),end=' ')
                print('第%s轮 第%s次' %(i+1,j+1),end=':')
                print(array,end='--->')
                array[j],array[j+1]=array[j+1],array[j]
                print(array)
            else:
                print("a[%s] a[%s]比较" %(j,j+1),end=' ')
                print('第%s轮 第%s次' %(i+1,j+1),end=':')
                print(array,end='--->')
                print(array)
        for k in range(length-2-i,i,-1):
            if array[k]<array[k-1]:
                print("a[%s] a[%s]比较" %(k,k-1),end=' ')
                print('第%s轮 第n次' %(i+1),end=':')
                print(array,end='--->')
                array[k],array[k-1]=array[k-1],array[k]
                print(array)
            else:
                print("a[%s] a[%s]比较" %(k,k-1),end=' ')
                print('第%s轮 第n次' %(i+1),end=':')
                print(array,end='--->')
                print(array)
    return array

if __name__ == '__main__':
    array=[12,25,5,13,21,37]
    print(array)
    print(cocktail_sort(array))


[12, 25, 5, 13, 21, 37]
a[0] a[1]比较 第1轮 第1次:[12, 25, 5, 13, 21, 37]--->[12, 25, 5, 13, 21, 37]
a[1] a[2]比较 第1轮 第2次:[12, 25, 5, 13, 21, 37]--->[12, 5, 25, 13, 21, 37]
a[2] a[3]比较 第1轮 第3次:[12, 5, 25, 13, 21, 37]--->[12, 5, 13, 25, 21, 37]
a[3] a[4]比较 第1轮 第4次:[12, 5, 13, 25, 21, 37]--->[12, 5, 13, 21, 25, 37]
a[4] a[5]比较 第1轮 第5次:[12, 5, 13, 21, 25, 37]--->[12, 5, 13, 21, 25, 37]
a[4] a[3]比较 第1轮 第n次:[12, 5, 13, 21, 25, 37]--->[12, 5, 13, 21, 25, 37]
a[3] a[2]比较 第1轮 第n次:[12, 5, 13, 21, 25, 37]--->[12, 5, 13, 21, 25, 37]
a[2] a[1]比较 第1轮 第n次:[12, 5, 13, 21, 25, 37]--->[12, 5, 13, 21, 25, 37]
a[1] a[0]比较 第1轮 第n次:[12, 5, 13, 21, 25, 37]--->[5, 12, 13, 21, 25, 37]
a[1] a[2]比较 第2轮 第2次:[5, 12, 13, 21, 25, 37]--->[5, 12, 13, 21, 25, 37]
a[2] a[3]比较 第2轮 第3次:[5, 12, 13, 21, 25, 37]--->[5, 12, 13, 21, 25, 37]
a[3] a[4]比较 第2轮 第4次:[5, 12, 13, 21, 25, 37]--->[5, 12, 13, 21, 25, 37]
a[3] a[2]比较 第2轮 第n次:[5, 12, 13, 21, 25, 37]--->[5, 12, 13, 21, 25, 37]
a[2] a[1]比较 第2轮 第n次:[5, 12, 13, 21, 25, 37]--->[5, 12, 13, 21, 25, 37]
a[2] a[3]比较 第3轮 第3次:[5, 12, 13, 21, 25, 37]--->[5, 12, 13, 21, 25, 37]
[5, 12, 13, 21, 25, 37]

 

posted @ 2016-09-02 13:19  假面对白  阅读(444)  评论(0编辑  收藏  举报