【每日算法】交换排序算法之鸡尾酒排序/双向冒泡排序

1)算法简介

鸡尾酒排序等于是冒泡排序的轻微变形。不同的地方在于从低到高然后从高到低,而冒泡排序则仅从低到高去比较序列里的每个元素。他可以得到比冒泡排序稍微好一点的效能,原因是冒泡排序只从一个方向进行比对(由低到高),每次循环只移动一个项目。

2)算法描述和分析

1、依次比较相邻的两个数,将小数放在前面,大数放在后面;
2、第一趟可得到:将最大数放到最后一位。
3、第二趟可得到:将第二大的数放到倒数第二位。
4、如此下去,重复以上过程,直至最终完成排序。
鸡尾酒排序最糟或是平均所花费的次数都是O(n^2),但如果序列在一开始已经大部分排序过的话,会接近O(n)。

最差时间复杂度: O(n^2)
最优时间复杂度: O(n)
平均时间复杂度: O(n^2)

3)算法图解、flash演示、视频演示

图解:

鸡尾酒排序

Flash:
参见http://zh.wikipedia.org/zh-cn/%E9%B8%A1%E5%B0%BE%E9%85%92%E6%8E%92%E5%BA%8F右侧flash动画

4)算法代码

void CocktailSort(int *a,int nsize)  
{  
    int tail=nsize-1;  
    for (int i=0;i<tail;)  
    {  
        for (int j=tail;j>i;--j) //第一轮,先将最小的数据排到前面  
        {  
            if (a[j]<a[j-1])  
            {  
                int temp=a[j];  
                a[j]=a[j-1];  
                a[j-1]=temp;  
            }  
        }  
        ++i;    //原来i处数据已排好序,加1  
        for (j=i;j<tail;++j)    //第二轮,将最大的数据排到后面  
        {  
            if (a[j]>a[j+1])  
            {  
                int temp=a[j];  
                a[j]=a[j+1];  
                a[j+1]=temp;  
            }      
        }  
        tail--;      //原tail处数据也已排好序,将其减1  
    }  
}  

5)考察点,重点和频度分析

鸡尾酒排序在博主印象中出现的频度也不高,用到它的算法题大题很少,选择填空出现的话多以双向冒泡排序的名称出现,注意注意时间空间复杂度,理解理解算法应该问题就不大了。

6)笔试面试例题

考点基本类似冒泡排序,请参考上一节

原文地址:https://www.cnblogs.com/shih/p/6660064.html