CockTailSort

今天看到鸡尾酒排序,看名字就像了解下,之前好像有稍微听过,但是具体不知道是啥。

是冒泡排序的改进版,原来每次冒最大(小)到最后面,现在两端来回冒,这样有啥好处呢?
例如 23451这样的 只要一来一回就排好了,但是bubblesort却要很多次。

所以写算法,感觉是n/2个来回,n为偶正好冒完所有,n为奇,除掉中间的元素,最后肯定也是定好位置的,因为其他n-1个元素都订好位置了。
另外和bubblesort一样,加swap flag,如果一来或者一回没有交换,那么就排好序了,调用C++11的swap函数。

后来看了下wikipedia的,感觉实现不太一样,他是直接用swap就来判断外部循环,思路也是一致,每个来回长度都要缩减2,

void CockTailSort(int*a, int n)
{
    bool isswap;
    for(int i=1;i<=n/2;i++)
    {
        isswap=false;
        for(int j=i-1;j<=n-i-1;j++)
        {
            if(a[j]>a[j+1])
                swap(a[j],a[j+1]),isswap=true;

        }
        if(isswap==false) break;
        isswap=false;
        for(int j=n-i-1;j>=i;j--)
        {
            if(a[j-1]>a[j])
                swap(a[j],a[j-1]),isswap=true;
        }
        if(isswap==false) break;
    }
}

Posted by richard爱闹 - 7月 22 2014
如需转载,请注明: 本文来自 Richard