鸡尾酒排序,也就是定向冒泡排序,鸡尾酒搅拌排序,搅拌排序(也可以视作选择排序的一种变形),涟漪排序,来回排序or 快乐小时排序,是冒泡排序的一种变形。此算法与冒泡排序的不同处在于排序时是以双向在序列中进行排序。
** 理解 **
还是以a=[12,25,5,13,21,37]为例 第1轮:
1.[<u>12,25,</u>5,13,21,37]--a[0]=12与a[1]=25比较-->[12,25,5,13,21,37]
2.[12,<u>25,5,</u>13,21,37]--a[1]=25与 a[2]= 5比较-->[12,5,25,13,21,37]
3.[12,5,<u>25,13,</u>21,37]--a[2]=25与a[3]=13比较-->[12,5,13,25,21,37]
4.[12,5,13,<u>25,21,</u>37]--a[3]=25与a[4]=21比较-->[12,5,13,21,25,37]
5.[12,5,13,21,<u>25,37</u>]--a[4]=25与a[5]=37比较-->[12,5,13,21,25,37]
6.[12,5,13,<u>21,25,</u>37]--a[4]=25与a[3]=21比较-->[12,5,13,21,25,37]
7.[12,5,<u>13,21,</u>25,37]--a[3]=21与a[2]=13比较-->[12,5,13,21,25,37]
8.[12,<u>5,13,</u>21,25,37]--a[2]=13与 a[1]= 5比较-->[12,5,13,21,25,37]
9.[<u>12,5,</u>13,21,25,37]-- a[1]= 5与a[0]=12比较-->[5,12,13,21,25,37]
第1轮即排序完成,可设置标志位,若某1轮来回没有一次交换,即排序结束。
Python代码
def cocktail_sort(array):
length=len(array)
for i in range(length//2): #每一轮来回,只需冒泡排序的一半
#每一轮后,都会除去开头和结尾两个元素,最小最大在开头和结尾
for j in range(i,length-1-i): #从开头到结尾
if array[j]>array[j+1]:
array[j],array[j+1]=array[j+1],array[j]
for k in range(length-2-i,i,-1): #从倒数第二个数到开头第二个数
if array[k]<array[k-1]:
array[k],array[k-1]=array[k-1],array[k]
return array
if __name__ == '__main__':
array=[12,25,5,13,21,37]
print(cocktail_sort(array))
结果
[5, 12, 13, 21, 25, 37]
加上打印函数,看看比较过程
def cocktail_sort(array):
length=len(array)
for i in range(length//2):
for j in range(i,length-1-i):
if array[j]>array[j+1]:
print("a[%s] a[%s]比较" %(j,j+1),end=' ')
print('第%s轮 第%s次' %(i+1,j+1),end=':')
print(array,end='--->')
array[j],array[j+1]=array[j+1],array[j]
print(array)
else:
print("a[%s] a[%s]比较" %(j,j+1),end=' ')
print('第%s轮 第%s次' %(i+1,j+1),end=':')
print(array,end='--->')
print(array)
for k in range(length-2-i,i,-1):
if array[k]<array[k-1]:
print("a[%s] a[%s]比较" %(k,k-1),end=' ')
print('第%s轮 第n次' %(i+1),end=':')
print(array,end='--->')
array[k],array[k-1]=array[k-1],array[k]
print(array)
else:
print("a[%s] a[%s]比较" %(k,k-1),end=' ')
print('第%s轮 第n次' %(i+1),end=':')
print(array,end='--->')
print(array)
return array
if __name__ == '__main__':
array=[12,25,5,13,21,37]
print(array)
print(cocktail_sort(array))
[12, 25, 5, 13, 21, 37]
a[0] a[1]比较 第1轮 第1次:[12, 25, 5, 13, 21, 37]--->[12, 25, 5, 13, 21, 37]
a[1] a[2]比较 第1轮 第2次:[12, 25, 5, 13, 21, 37]--->[12, 5, 25, 13, 21, 37]
a[2] a[3]比较 第1轮 第3次:[12, 5, 25, 13, 21, 37]--->[12, 5, 13, 25, 21, 37]
a[3] a[4]比较 第1轮 第4次:[12, 5, 13, 25, 21, 37]--->[12, 5, 13, 21, 25, 37]
a[4] a[5]比较 第1轮 第5次:[12, 5, 13, 21, 25, 37]--->[12, 5, 13, 21, 25, 37]
a[4] a[3]比较 第1轮 第n次:[12, 5, 13, 21, 25, 37]--->[12, 5, 13, 21, 25, 37]
a[3] a[2]比较 第1轮 第n次:[12, 5, 13, 21, 25, 37]--->[12, 5, 13, 21, 25, 37]
a[2] a[1]比较 第1轮 第n次:[12, 5, 13, 21, 25, 37]--->[12, 5, 13, 21, 25, 37]
a[1] a[0]比较 第1轮 第n次:[12, 5, 13, 21, 25, 37]--->[5, 12, 13, 21, 25, 37]
a[1] a[2]比较 第2轮 第2次:[5, 12, 13, 21, 25, 37]--->[5, 12, 13, 21, 25, 37]
a[2] a[3]比较 第2轮 第3次:[5, 12, 13, 21, 25, 37]--->[5, 12, 13, 21, 25, 37]
a[3] a[4]比较 第2轮 第4次:[5, 12, 13, 21, 25, 37]--->[5, 12, 13, 21, 25, 37]
a[3] a[2]比较 第2轮 第n次:[5, 12, 13, 21, 25, 37]--->[5, 12, 13, 21, 25, 37]
a[2] a[1]比较 第2轮 第n次:[5, 12, 13, 21, 25, 37]--->[5, 12, 13, 21, 25, 37]
a[2] a[3]比较 第3轮 第3次:[5, 12, 13, 21, 25, 37]--->[5, 12, 13, 21, 25, 37]
[5, 12, 13, 21, 25, 37]