代码改变世界

每周一算法之二——鸡尾酒排序

2011-12-11 23:10  贼寇在何方  阅读(217)  评论(0编辑  收藏

今儿兴致好,再上一个排序。

鸡尾酒排序,又称定向冒泡排序。冒泡排序的每一次冒泡都是从前往后,而鸡尾酒排序是从前往后与从后往前交替进行的。鸡尾酒排序效率稍好与冒泡排序。

时间复杂O(n2),与冒泡排序一样,适用于基本有序的序列。

上代码:

// 鸡尾酒排序算法,又称定向冒泡排序
// C++实现
#include <iostream>

using namespace std;

template<class T>
void cocktail_sort(T array[], int size)
{
    int i;
    int buttom = 0;
    int top = size - 1;
    
    T temp;
    bool swapped = true; // 标记是否发生交换
    
    while( true )
    {
        swapped = false;
        // 正向冒泡
        for( i=0; i<top; i++ )
        {
            if( array[i] > array[i+1] )
            {
                temp = array[i];
                array[i] = array[i+1];
                array[i+1] = temp;
                swapped = true;
            }
        }
        if( !swapped )
            break;
            
        top--;
        
        // 反向冒泡
        for( ; i>buttom; i-- )
        {
            if( array[i] < array[i-1] )
            {
                temp = array[i];
                array[i] = array[i-1];
                array[i-1] = temp;
                swapped = true;
            }
        }
        if( !swapped )
            break;
        
        buttom++;
    }
}

int main(void)
{
    int array[] = {2, 5, 3, 1, 6, 4, 7};
    cocktail_sort(array, sizeof(array) / sizeof(int));

    for (int i = 0; i < sizeof(array) / sizeof(int); i ++)
        cout<<array[i];
            
    return 0;
}