鸡尾酒排序

鸡尾酒排序（Cocktail shaker sort），亦为定向冒泡排序，鸡尾酒搅拌排序，搅拌排序（也可以视作选择排序的一种变形），涟漪排序，来回排序或快乐小时排序，是冒泡排序的一种变形。此演算法与冒泡排序的不同处在于排序时是以双向在序列中进行排序。
伪代码.
将一个序列由小到大进行排序：
与冒泡排序不同的地方.
鸡尾酒排序等于是冒泡排序的轻微变形。不同的地方在于从低到高然后从高到低，而冒泡排序则仅从低到高去比较序列里的每个元素。他可以得到比冒泡排序稍微好一点的效能，原因是冒泡排序只从一个方向进行比对（由低到高），每次循环只移动一个项目。
以序列（2,3,4,5,1）为例，鸡尾酒排序只需要访问一次序列就可以完成排序，但如果使用冒泡排序则需要四次。但是在乱数序列的状态下，鸡尾酒排序与冒泡排序的效率与其他众多排序算法相比均比较低。
实作范例.
C语言.
<syntaxhighlight lang="c" line="1">
void cocktail_sort(int arr[], int len) {
 int i, left = 0, right = len - 1;
 int temp;
 while (left < right) {
 for (i = left; i < right; i++)
 if (arr> arr[i + 1) {
 temp = arr;
 arr= arr[i + 1;
 arr+ 1 = temp;
 right--;
 for (i = right; i > left; i--)
 if (arr- 1 > arr) {
 temp = arr;
 arr= arr[i - 1;
 arr- 1 = temp;
 left++;
</syntaxhighlight>
C++.
<syntaxhighlight lang = "cpp">
template<typename T> //整数或浮点数皆可使用,若要使用物件(class)时必须设定大于(>)的运算子功能
void cocktail_sort(T arr[], int len) {
 int j, left = 0, right = len - 1;
 while (left < right) {
 for (j = left; j < right; j++)
 if (arr> arr[j + 1)
 swap(arrarr[j + 1);
 right--;
 for (j = right; j > left; j--)
 if (arr- 1 > arr)
 swap(arr- 1, arr);
 left++;
</syntaxhighlight>
Rust.
<syntaxhighlight lang = "Rust">
fn cocktail_sort<T: PartialOrd>(arr: &mut ) {
</syntaxhighlight>
JAVA.
<syntaxhighlight lang="java" line="1">
public static void cocktail_sort(int[] arr) { 
 int i, left = 0, right = arr.length - 1;
 int temp;
 while (left < right) {
 for (i = left; i < right; i++)
 if (arr> arr[i + 1) {
 temp = arr;
 arr= arr[i + 1;
 arr+ 1 = temp;
 right--;
 for (i = right; i > left; i--)
 if (arr- 1 > arr) {
 temp = arr;
 arr= arr[i - 1;
 arr- 1 = temp;
 left++;
</syntaxhighlight>
JavaScript.
<syntaxhighlight lang="javascript" line="1">
Array.prototype.cocktail_sort = function() {
 var i, left = 0, right = this.length - 1;
 var temp;
 while (left < right) {
 for (i = left; i < right; i++)
 if (this> this[i + 1) {
 temp = this;
 this= this[i + 1;
 this+ 1 = temp;
 right--;
 for (i = right; i > left; i--)
 if (this- 1 > this) {
 temp = this;
 this= this[i - 1;
 this- 1 = temp;
 left++;
};
</syntaxhighlight>
PHP.
<syntaxhighlight lang="php" line="1">
function swap(&$x, &$y) {
 $t = $x;
 $x = $y;
 $y = $t;
function cocktail_sort(&$arr) {//php的阵列视为基本型别，所以必须用传参才能修改原阵列
 $left = 0;
 $right = count($arr) - 1;
 while ($left < $right) {
 for ($j = $left; $j < $right; $j++)
 if ($arr[$j] > $arr[$j + 1])
 swap($arr[$j], $arr[$j + 1]);
 $right--;
 for ($j = $right; $j > $left; $j--)
 if ($arr[$j - 1] > $arr[$j])
 swap($arr[$j - 1], $arr[$j]);
 $left++;
</syntaxhighlight>
Python 2.7.
<syntaxhighlight lang="python3" line="1">
def cocktail_sort(l):
if __name__ == '__main__':
</syntaxhighlight>
Python 3.10.
<syntaxhighlight lang="python3" line="1">
def cocktail_sort(arr: list, bottom: int = None, top: int = None):
if __name__ == '__main__':
</syntaxhighlight>
Golang.
<syntaxhighlight lang="go" line="1">
func cocktailSort(arr []int) {
 left := 0
 right := len(arr) - 1
 for left < right {
 for i := left; i < right; i++ {
 if arr> arr[i+1 {
 arrarr[i+1 = arrarr[i
 right--
 for i := right; i > left; i-- {
 if arr> arr[i {
 arrarr[i = arrarr[i-1
 left++
</syntaxhighlight>
Julia (程式语言).
<syntaxhighlight lang="julia">
function CocktailSort(A)
 isordered, lo, hi = false, 1, length(A)
 while !isordered && hi > lo
 isordered = true
 for i=lo+1:hi
 if A A[i
 AA[i = AA[i-1
 isordered = false
 end
 end
 lo += 1
 end
 return A
end
A = [16,586,1,31,354,43,3]
println(A) # Original Array
println(CocktailSort(A)) # Cocktail Sort Array
</syntaxhighlight>
复杂度.
鸡尾酒排序最糟或是平均所花费的次数都是formula_1，但如果序列在一开始已经大部分排序过的话，会接近formula_2。