您的位置:首页 > 编程语言 > Python开发

python之鸡尾酒排序-cocktailSort

2020-06-30 16:57 405 查看

鸡尾酒排序

鸡尾酒排序是在冒泡排序上的基础上,进行的一次升级。冒泡排序只是单一方向的进行遍历,而鸡尾酒排序的比较和交换是双向进行,这样大大提升了效率。

原理

举一个简单的列表:
[24, 12, 2, 3, 20, 44, 5, 48, 10, 22]

第一轮的时候,整体遍历从左向右
第一次
[24, 12, 2, 3, 20, 44, 5, 48, 10, 22]
[ 12,24, 2, 3, 20, 44, 5, 48, 10, 22]
第二次
[12, 24, 2, 3, 20, 44, 5, 48, 10, 22]
[ 12,2, 24, 3, 20, 44, 5, 48, 10, 22]
第三次
[12, 2, 24, 3, 20, 44, 5, 48, 10, 22]
[ 12,2, 3, 24, 20, 44, 5, 48, 10, 22]
第四次
[12, 2, 3, 24, 20, 44, 5, 48, 10, 22]
[ 12,2, 3, 20, 24, 44, 5, 48, 10, 22]
第五次
[12, 2, 3, 20, 24, 44, 5, 48, 10, 22]
[ 12,2, 3, 20, 24, 44, 5, 48, 10, 22]
第六次
[12, 2, 3, 20, 24, 44, 5, 48, 10, 22]
[ 12,2, 3, 20, 24, 5, 44, 48, 10, 22]
第七次
[12, 2, 3, 20, 24, 5, 44, 48, 10, 22]
[ 12,2, 3, 20, 24, 5, 44, 48, 10, 22]
第八次
[12, 2, 3, 20, 24, 5, 44, 48, 10, 22]
[ 12,2, 3, 20, 24, 5, 44, 10, 48, 22]
第九次
[12, 2, 3, 20, 24, 5, 44, 10, 48, 22]
[ 12,2, 3, 20, 24, 5, 44, 10, 22, 48]

第二轮的时候,整体遍历从右向左,但此时最大的值已经遍历得出了,那么就只需要从剩下的9个元素中遍历
第一次
[12, 2, 3, 20, 24, 5, 44, 10, 22, 48]
[ 12,2, 3, 20, 24, 5, 44, 10, 22, 48]
第二次
[12, 2, 3, 20, 24, 5, 44, 10, 22, 48]
[ 12,2, 3, 20, 24, 5, 10, 44, 22, 48]
第三次
[12, 2, 3, 20, 24, 5, 10, 44, 22, 48]
[ 12,2, 3, 20, 24, 5, 10, 44, 22, 48]
第四次
[12, 2, 3, 20, 24, 5, 10, 44, 22, 48]
[ 12,2, 3, 20, 5, 24, 10, 44, 22, 48]
第五次
[12, 2, 3, 20, 5, 24, 10, 44, 22, 48]
[ 12,2, 3, 5, 20, 24, 10, 44, 22, 48]
第六次
[12, 2, 3, 5, 20, 24, 10, 44, 22, 48]
[ 12,2, 3, 5, 20, 24, 10, 44, 22, 48]
第七次
[12, 2, 3, 5, 20, 24, 10, 44, 22, 48]
[ 12,2, 3, 5, 20, 24, 10, 44, 22, 48]
第八次
[12, 2, 3, 5, 20, 24, 10, 44, 22, 48]
[ 2,12, 3, 5, 20, 24, 10, 44, 22, 48]

代码

从右向左遍历得到最小的值之后剩下的内容同理
原理清楚之后,上代码

1、创建随机列表

def creat_random_list():
'''
创建随机列表
:return: 列表结果
'''

num = int(input('请输入生成数组的规模:'))
start_num = int(input('请输入开始的数字:'))
end_num = int(input('请输入结束的数字:'))

for i in range(num):
n = random.randint(start_num, end_num)
num_list.append(n)

return num_list

2、鸡尾酒排序具体实现

def cocktail_sort(res_num):
'''
实现鸡尾酒排序
:param res_num: 随机数列
:return: 排序之后的列表
'''
for i in range(len(res_num)//2):  # 因为是双向遍历,做一半即可
# 设置发生交换的标记变量
isSorted = True
for odd in range(i, len(res_num) - i -1):  # 奇数轮
if res_num[odd] > res_num[odd + 1]:
res_num[odd], res_num[odd + 1] = res_num[odd + 1], res_num[odd]
isSorted = False
if isSorted: break

# 发生比较交换之前,重新更新一下isSorted
isSorted = True
for even in range(len(res_num) - i -1, i, -1):
if res_num[even] < res_num[even - 1]:
res_num[even], res_num[even - 1] = res_num[even - 1], res_num[even]
isSorted = False
if isSorted: break

return res_num

执行效果

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: