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

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博客_鸡尾酒算法

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

UQI-LIUWJ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值