算法笔记:鸡尾酒排序算法
Posted UQI-LIUWJ
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法笔记:鸡尾酒排序算法相关的知识,希望对你有一定的参考价值。
1 鸡尾酒算法介绍
- 算法笔记:冒泡排序_UQI-LIUWJ的博客-CSDN博客 的增强版:冒泡排序是从左到右单向的遍历和比较;鸡尾酒排序算法则是双向的元素遍历和比较
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博客_鸡尾酒算法
以上是关于算法笔记:鸡尾酒排序算法的主要内容,如果未能解决你的问题,请参考以下文章