排序算法之鸡尾酒排序

鸡尾酒排序

     鸡尾酒排序实际上是一种双向的冒泡排序。第一趟,从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;
}
时间: 2024-11-01 18:58:18

排序算法之鸡尾酒排序的相关文章

Javascript排序算法之计数排序的实例

 计数排序是一种高效的线性排序,它通过计算一个集合中元素楚翔的次数来确定集合如何排列,计数排序不需要进行数据的比较,所有他的运行效率前面介绍的都高 计数排序(Counting sort)是一种稳定的排序算法.计数排序使用一个额外的数组Count_arr,其中第i个元素是待排序数组Arr中值等于i的元素的个数.然后根据数组Count_arr来将Arr中的元素排到正确的位置. 分为四个步骤: 1.找出待排序的数组中最大和最小的元素 2.统计数组中每个值为i的元素出现的次数,存入数组Count_arr

Javascript排序算法之合并排序的2个例子介绍

 这篇文章主要介绍了Javascript排序算法之合并排序(归并排序)的2个例子,需要的朋友可以参考下 归并排序(Merge sort)是建立在归并操作上的一种有效的排序算法.该算法是采用分治法(Divide and Conquer)的一个非常典型的应用.   归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的.然后再把有序子序列合并为整体有序序列.   归并排序是建立在归并操作上的一种有效的排序算法.该算法是采用分治法(

Javascript排序算法之计数排序的实例_javascript技巧

计数排序(Counting sort)是一种稳定的排序算法.计数排序使用一个额外的数组Count_arr,其中第i个元素是待排序数组Arr中值等于i的元素的个数.然后根据数组Count_arr来将Arr中的元素排到正确的位置.分为四个步骤:1.找出待排序的数组中最大和最小的元素2.统计数组中每个值为i的元素出现的次数,存入数组Count_arr的第i项3.对所有的计数累加(从Count_arr中的第一个元素开始,每一项和前一项相加)4.反向遍历原数组:将每个元素i放在新数组的第Count_arr

排序算法之耐心排序

排序算法之耐心排序      耐心排序的基本思想:耐心排序还是对插入排序做的一种优化,先将数据调整为基本有序,再进行一次插入排序.耐心排序的关键点是在建桶和入桶的规则上面.      (1)如果还没有桶,新建一个桶.如果不符合入桶规则那么新建一个桶.      (2)要入桶的数字只要比桶里最上面的数字小,即可入桶:如果有多个桶可入,则按照从左到右的顺序入桶.      举例:有待排序序列6, 3, 4, 7, 1, 2, 8,5      (1)取数据6,目前还没有桶,则新建桶[1],将6入桶.

排序算法之地精排序

排序算法之地精排序      地精排序是最简单的排序算法,它只用一重循环就可以实现.它也像冒泡排序一样,相邻元素之间两两进行比较,如果这两个元素逆序,则交换.与冒泡排序不同的是,它如果遇到交换操作时,变为向前冒泡,直至不发生交换操作位置.相当于做了一个插入操作,将比较小的数插入到前面的有序序列中合适的位置.所以,地精排序可以说是冒泡排序和直接插入排序的综合.      其排序过程如下:循环变量i初值为0.进入循环,当i为0时什么也不做,直接i++.当i不为0时,比较下标为i和i-1的数值,如果正

排序算法之奇偶排序

排序算法之奇偶排序      奇偶排序的基本思想就是先对奇数列进行一趟排序,比较奇数列和其相邻的偶数列的元素,如果逆序则交换.再对偶数列进行一趟排序,比较偶数列和其相邻的奇数列的元素,如果逆序则交换.接着对奇数列进行排序,再对偶数列进行排序,重复进行这样的过程,直到奇数列排序和偶数列排序都没有进行交换操作为止.      例如:待排序序列{6, 2, 4, 1, 5,7}      对奇数列和其相邻的偶数列进行排序:比较2与4,比较1与5.不进行交换操作.      对偶数列和其相邻的奇数列进行

排序算法之梳排序

排序算法之梳排序      基本思想:梳排序和希尔排序很类似.希尔排序是在直接插入排序的基础上做的优化,而梳排序是在冒泡排序的基础上做的优化.也是想希尔排序一样,将待排序序列通过增量分为若干个子序列,然后对子序列进行一趟冒泡排序,一步步减小增量,直至增量为1.所以梳排序的最后一次排序是冒泡排序.      梳排序增量是根据递减率减小的,递减率的设定影响着梳排序的效率,原作者以随机数作实验,得到最有效递减率为1.3的.      举例:待排序序列为{8, 6, 5, 2, 1, 4, 3,7}  

JavaScript排序算法之希尔排序的2个实例_基础知识

插入排序在对几乎已经排好序的数据操作时, 效率高, 即可以达到线性排序的效率.但插入排序一般来说是低效的, 因为插入排序每次只能将数据移动一位.希尔排序按其设计者希尔(Donald Shell)的名字命名,该算法由1959年公布.一些老版本教科书和参考手册把该算法命名为Shell-Metzner,即包含Marlene Metzner Norton的名字,但是根据Metzner本人的说法,"我没有为这种算法做任何事,我的名字不应该出现在算法的名字中." 希尔排序基本思想:先取一个小于n的

排序算法之珠排序

排序算法之珠排序         基本思想:将每个数用珠子表示,例如:数字5就是5个珠子.用珠子表示好每一个数后,让所有的珠子自由下落.排序完成.         例如:数字,{6, 2, 4, 1, 5, 9}         (1)将这些数都用珠子表示.        (2)让珠子自由下落. 完成了排序{1, 2, 4, 5, 6, 9} BOOL BeadSort(datatype *array, int size) { char **bead; int i, j, k, n, len;