鸡尾酒排序Cocktail Sort

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

** 理解 **

还是以a=[12,25,5,13,21,37]为例 第1轮:
1.[<u>12,25,</u>5,13,21,37]--a[0]=12与a[1]=25比较-->[12,25,5,13,21,37]
2.[12,<u>25,5,</u>13,21,37]--a[1]=25与 a[2]= 5比较-->[12,5,25,13,21,37]
3.[12,5,<u>25,13,</u>21,37]--a[2]=25与a[3]=13比较-->[12,5,13,25,21,37]
4.[12,5,13,<u>25,21,</u>37]--a[3]=25与a[4]=21比较-->[12,5,13,21,25,37]
5.[12,5,13,21,<u>25,37</u>]--a[4]=25与a[5]=37比较-->[12,5,13,21,25,37]
6.[12,5,13,<u>21,25,</u>37]--a[4]=25与a[3]=21比较-->[12,5,13,21,25,37]
7.[12,5,<u>13,21,</u>25,37]--a[3]=21与a[2]=13比较-->[12,5,13,21,25,37]
8.[12,<u>5,13,</u>21,25,37]--a[2]=13与 a[1]= 5比较-->[12,5,13,21,25,37]
9.[<u>12,5,</u>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]
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 曾经有一份美好的爱情放在我的面前我没有珍惜。等到失去后才后悔莫及。如果可以再对小李说。毛欣想说。这辈子无缘再牵手。...
    毛欣与小李阅读 7,724评论 0 13
  • 【1】7,9,-1,5,( ) A、4;B、2;C、-1;D、-3 分析:选D,7+9=16;9+(-1)=8;(...
    Alex_bingo阅读 19,567评论 1 19
  • 冒泡排序(英语:Bubble Sort,台湾另外一种译名为:泡沫排序)是一种简单的排序算法。它重复地走访过要排序的...
    ShortLife阅读 2,985评论 0 0
  • 《夏日送别》 孤疯 你的微笑是出水的芙蓉, 洁白无瑕中不惧烈日当空。 谢谢你微笑着送我离去, 离开...
    似峰上风已疯阅读 1,066评论 0 0
  • 才从北京回来,跟老公一起出差,他出差,我在北京玩。五天,把俩孩子丢给她爷爷奶奶。 临出门时,公公还说 今年去 的地...
    美丽selina阅读 3,468评论 10 1