• 鸡尾酒排序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]
  • 相关阅读:
    微信小程序Java登录流程(ssm实现具体功能和加解密隐私信息问题解决方案)
    微信公众号支付开发全过程(java版)
    java实现沙箱测试环境支付宝支付(demo)和整合微信支付和支付宝支付到springmvc+spring+mybatis环境全过程(支付宝和微信支付、附源码)
    自己动手写一个单链表
    设计模式——开发常用的设计模式梳理
    Hexo+github搭建个人博客-博客发布篇
    Hexo+github搭建个人博客-博客初始化篇
    Hexo+github搭建个人博客-环境搭建篇
    git使用说明
    Eclipse快捷键
  • 原文地址:https://www.cnblogs.com/moon-future/p/5833158.html
Copyright © 2020-2023  润新知