算法笔记:鸡尾酒排序算法

Posted UQI-LIUWJ

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法笔记:鸡尾酒排序算法相关的知识,希望对你有一定的参考价值。

1 鸡尾酒算法介绍

2 算法举例

比如有一个无序数列 2、3、4、5、6、7、8、1,如果用冒泡排序的话:

 需要7轮(即使2~8已经排序完成了,但也需要一个一个冒泡到相应的位置去)

如果是鸡尾酒算法的话:

第二轮,则从右向左进行比较、交换

 那么鸡尾酒算法第二轮结束的时候已经排序完成了,比冒泡排序少了很多轮

3 算法实现(python)

lst=np.random.randn(15).tolist()

right_end_index=len(lst)-1
#每一轮从左向右比较的j坐标的末尾坐标

left_end_index=0
'''
为防止混淆,right_end_index和left_end_index统一为j下标的取值范围
right_end_index右边的部分表示已经排序完成
left_end_index坐标的部分表示已经排序完成
'''

while(left_end_index<=right_end_index):
    #left_end_index越过right_end_index,也即全部排序完成,结束循环
    
    
    ##########从左到右的遍历#################
    if_sort=True
    #记录这一轮有没有顺序的交换,如果没有交换,那么表示已经全部排序完成,结束循环
    
    tmp_right_index=0
    
    for i in range(left_end_index,right_end_index):
        if(lst[i]>lst[i+1]):
            tmp=lst[i+1]
            lst[i+1]=lst[i]
            lst[i]=tmp
            
            if_sort=False
            #记录这一轮有没有顺序的交换,如果没有交换,那么表示已经全部排序完成,结束循环
            
            tmp_right_index=i
            #记录下发生交换时的坐标
            
            
    if(if_sort==True):
        break
    #如果这一轮没有交换,那么表示已经全部排序完成,结束循环
    right_end_index=tmp_right_index
    #当前这一轮最后一次发生交换时j的位置,之后的位置都排序完成了,不用看了
    
    
    ######################从右到左的遍历#####################
    if_sort=True
    #记录这一轮有没有顺序的交换,如果没有交换,那么表示已经全部排序完成,结束循环
    tmp_left_index=0
    for i in range(right_end_index-1,left_end_index-1,-1):
        if(lst[i]>lst[i+1]):
            tmp=lst[i]
            lst[i]=lst[i+1]
            lst[i+1]=tmp
            
            if_sort=False
            #记录这一轮有没有顺序的交换,如果没有交换,那么表示已经全部排序完成,结束循环
            tmp_left_index=i
            #记录下发生交换时的坐标
    
    if(if_sort==True):
        break
    #如果这一轮没有交换,那么表示已经全部排序完成,结束循环
    left_end_index=tmp_left_index
    #当前这一轮最后一次发生交换时j的位置,之后的位置都排序完成了,不用看了
    
lst
'''
[-3.518066822012489,
 -1.760503073954738,
 -1.3848314472719063,
 -1.3730974688669046,
 -1.2553601438343112,
 -0.8559605300072622,
 -0.7657187578085134,
 -0.4916810920721081,
 -0.47521760504979693,
 -0.43789040798548945,
 -0.3119225685834982,
 -0.24598546020796994,
 0.3366947086052988,
 0.7813591540294047,
 1.8229987688594964]
'''

4 复杂度

鸡尾酒排序算法是对冒泡排序算法的优化,它的复杂度和稳定性和冒泡排序算法是一致的,时间复杂度为O(N^2),空间复杂度为O(1)【虽然轮次减少,所以所需时间会比冒泡算法稍微少一些】

参考内容: 鸡尾酒排序算法详解_小小学编程的博客-CSDN博客_鸡尾酒算法

以上是关于算法笔记:鸡尾酒排序算法的主要内容,如果未能解决你的问题,请参考以下文章

js鸡尾酒排序算法

算法----鸡尾酒排序

排序算法总结——冒泡排序与鸡尾酒排序

排序算法总结

[golang] 数据结构-鸡尾酒排序

视频动画 | 什么是鸡尾酒排序?