鸡尾酒排序

鸡尾酒(Cocktail)排序是冒泡排序的变体,它在两个方向上交替遍历列表。 它与冒泡排序的不同之处在于,冒泡排序仅在前向方向上遍历列表,而此算法在一次迭代中向前和向后遍历。

1. 算法

在鸡尾酒排序中,一次迭代包括两个阶段:

  1. 第一阶段循环遍历数组,如从左到右的冒泡排序。 比较相邻元素,如果左元素大于右元素,则交换这些元素。列表的最大元素放在前向传递中数组的末尾。

  2. 第二阶段从最右边未排序的元素到左边循环遍历数组。 比较相邻元素,如果右元素小于左元素,则交换这些元素。 列表的最小元素放在向后传递的数组的开头。

该过程将继续,直到列表变为未排序。

示例

假设有一个数组:A:{8,2,3,1,9}。 使用鸡尾酒(Cocktail)排序对数组的元素进行排序。

迭代1:

前进传递:

8 与 2比较 ; 8>2 → 交换(8,2)  

A={2,8,3,1,9}  

8 与 3比较 ; 8>3 → 交换(8,3)   

A={2,3,8,1,9}  

8 与 1 比较 ; 8 > 1 → 交换(8,1)   

A = {2,3,1,8,9}   

8 与 9 比较; 8<9 → 不交换

在第一次前进传递结束时:列表中最大的元素放在最后。

A={2, 3, 1, 8, 9 }

后退传递:

8 与 1 比较; 8> 1 → 不交换

A={2, 3, 1, 8, 9 }  
1 与 3 比较 ; 3>1 → 交换(1,3)   

A={2, 1, 3, 8, 9 }  

1 与 2 比较 ; 2> 1 → 交换(1,2)  

A={1, 2, 3, 8, 9}

在第一次向后通过结束时; 最小元素已放置在数组的第一个索引处。

如果看一下第一步产生的列表; 就发现列表已按升序排序,但算法将完全自行处理。

复杂性

复杂性 最好情况 平均情况 最坏情况
时间复杂性 O(n^2) O(n^2) O(n^2)
空间复杂性 - - O(1)

使用C语言实现鸡尾酒(Cocktail)排序,代码如下 -

#include <stdio.h>  
int temp;   
void Cocktail(int a[], int n)  
{  
    int is_swapped = 1;  
    int begin = 0,i;  
    int end = n - 1;  

    while (is_swapped) {  
        is_swapped = 0;  
     for (i = begin; i < end; ++i) {  
            if (a[i] > a[i + 1]) {  
            temp = a[i];  
        a[i]=a[i+1];  
        a[i+1]=temp;                  
        is_swapped = 1;  
            }  
        }  
 if (!is_swapped)  
            break;  
 is_swapped = 0;  
 for (i = end - 1; i >= begin; --i) {  
     if (a[i] > a[i + 1])   
    {  
          temp = a[i];  
      a[i]=a[i+1];  
      a[i+1]=temp;  
      is_swapped = 1;  
         }  
      }  
        ++begin;  
    }  
}  

int main()  
{  
    int arr[] = {0, 10, 2, 8, 23, 1, 3, 45},i;  
    int n = sizeof(arr) / sizeof(arr[0]);  
    Cocktail(arr, n);  
    printf("printing sorted array :\n");  
     for (i = 0; i < n; i++)  
        printf("%d ", arr[i]);  
    printf("\n");  
    return 0;  
}

执行上面示例代码,得到以下结果:

printing sorted array :
0 1 2 3 8 10 23 45

使用C++语言实现鸡尾酒(Cocktail)排序,代码如下 -

#include <iostream>  
using namespace std;   
int temp;   
void Cocktail(int a[], int n)  
{  
    int is_swapped = 1;  
    int begin = 0,i;  
    int end = n - 1;  

    while (is_swapped) {  
        is_swapped = 0;  
     for (i = begin; i < end; ++i) {  
            if (a[i] > a[i + 1]) {  
            temp = a[i];  
        a[i]=a[i+1];  
        a[i+1]=temp;                  
        is_swapped = 1;  
            }  
        }  
 if (!is_swapped)  
            break;  
 is_swapped = 0;  
 for (i = end - 1; i >= begin; --i) {  
     if (a[i] > a[i + 1])   
    {  
          temp = a[i];  
      a[i]=a[i+1];  
      a[i+1]=temp;  
      is_swapped = 1;  
         }  
      }  
        ++begin;  
    }  
}  

int main()  
{  
    int arr[] = {0, 10, 2, 8, 23, 1, 3, 45},i;  
    int n = sizeof(arr) / sizeof(arr[0]);  
    Cocktail(arr, n);  
    cout <<"printing sorted array :\n";  
     for (i = 0; i < n; i++)  
        cout<<arr[i]<<" ";  
    cout<<"\n";  
    return 0;  
}

执行上面示例代码,得到以下结果:

printing sorted array :
0 1 2 3 8 10 23 45

使用Java语言实现鸡尾酒(Cocktail)排序,代码如下 -

public class CocktailSort   
{  
static int temp;   
static void Cocktail(int a[], int n)  
{  
    boolean is_swapped = true;  
    int begin = 0,i;  
    int end = n - 1;  

    while (is_swapped) {  
        is_swapped = false;  
     for (i = begin; i < end; ++i) {  
            if (a[i] > a[i + 1]) {  
            temp = a[i];  
        a[i]=a[i+1];  
        a[i+1]=temp;                  
        is_swapped = true;  
            }  
        }  
 if (!is_swapped)  
            break;  
 is_swapped = false;  
 for (i = end - 1; i >= begin; --i) {  
     if (a[i] > a[i + 1])   
    {  
          temp = a[i];  
      a[i]=a[i+1];  
      a[i+1]=temp;  
      is_swapped = true;  
         }  
      }  
        ++begin;  
    }  
}  
public static void main(String[] args) {  

    int arr[] = {0, 10, 2, 8, 23, 1, 3, 45},i;  
    int n = arr.length;  
    Cocktail(arr, n);  
    System.out.println("printing sorted array :\n");  
     for (i = 0; i < n; i++)  
        System.out.print(arr[i]+" ");  
    System.out.println();  
    }  
}

执行上面示例代码,得到以下结果:

printing sorted array :

0 1 2 3 8 10 23 45

使用C#语言实现鸡尾酒(Cocktail)排序,代码如下 -

using System;  
public class CocktailSort   
{  
static int temp;   
static void Cocktail(int[] a, int n)  
{  
    Boolean is_swapped = true;  
    int begin = 0,i;  
    int end = n - 1;  

    while (is_swapped) {  
        is_swapped = false;  
     for (i = begin; i < end; ++i) {  
            if (a[i] > a[i + 1]) {  
            temp = a[i];  
        a[i]=a[i+1];  
        a[i+1]=temp;                  
        is_swapped = true;  
            }  
        }  
 if (!is_swapped)  
            break;  
 is_swapped = false;  
 for (i = end - 1; i >= begin; --i) {  
     if (a[i] > a[i + 1])   
    {  
          temp = a[i];  
      a[i]=a[i+1];  
      a[i+1]=temp;  
      is_swapped = true;  
         }  
      }  
        ++begin;  
    }  
}  
public void Main() {  

    int[] arr = {0, 10, 2, 8, 23, 1, 3, 45};  
    int n = arr.Length,i;  
    Cocktail(arr, n);  
    Console.WriteLine("printing sorted array :\n");  
     for (i = 0; i < n; i++)  
        Console.Write(arr[i]+" ");  

    }

执行上面示例代码,得到以下结果:

printing sorted array :

0 1 2 3 8 10 23 45

上一篇: 双调排序 下一篇: 圈排序