python之鸡尾酒排序-cocktailSort

鸡尾酒排序

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

原理

举一个简单的列表:
[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

执行效果

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值