排序算法之鸡尾酒排序

鸡尾酒排序

     鸡尾酒排序实际上是一种双向的冒泡排序。第一趟,从0开始到size-1前往后做“冒泡”,将最大值移动到最后(下标为size-1)。第二趟,从size-2开始到0从后往前做“冒泡”,将最小值移动到最前面(下标为0)。第三趟,从1开始到size-2从前往后做“冒泡”,将最大值移动到最后(下标为size-2)。第四趟,从size-3开始到1从后往前做“冒泡”,将最小值移动到最前面(下标为1)。按照这样的顺序依次执行,到排序过程中没有进行交换操作为止。
     例如对序列{8, 3, 6, 1, 9, 5, 4}做鸡尾酒排序。第一趟从前往后,结果为{3, 6, 1, 8, 5, 4, 9}。第二趟从后往前,结果为{1, 3, 6, 4, 8, 5, 9}。第四趟从前往后,结果为{1, 3, 4, 6, 5, 8, 9}。第五趟从后往前,结果为{1, 3, 4, 5, 6, 8, 9}。第六趟从前往后,由于没有进行交换操作,所以排序完毕。最终结果为{1, 3, 4, 5, 6, 8, 9}

#define TRUE  1
#define FALSE 0

typedef int datatype;
typedef int BOOL;

BOOL CocktailSort(datatype *array, int size)
{
    int i, j;
    int tag;

    if(array == NULL) {
        return FALSE;
    }
//开始排序
    for(i = 0; i <= size / 2; i++) {
        tag = TRUE;
//从前往后,选出最大值放在这一趟的最后
        for(j = i; j < size-i-1; j++) {
            if(array[j] > array[j+1]) {
                Swap(array+j, array+j+1);
                tag = FALSE;
            }
        }

        if(tag) {
            return TRUE;
        }

//从后往前,选出最小值放在这一趟的最前面
        for(j = j-1; j > i; j--) {
            if(array[j] < array[j-1]) {
                Swap(array+j, array+j-1);
                tag = FALSE;
            }
        }

        if(tag) {
            return TRUE;
        }
    }

    return TRUE;
}
上一篇:IE 6 全球分布图 - 中国一枝独秀


下一篇:TCP协议详解(理论篇)