排序算法之梳排序

排序算法之梳排序

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

#define LAPSE_RATE 1.3
BOOL CombSort(datatype *array, int size)
{
    int i, j;
    int increment;

    if(array == NULL ) {
        return FALSE;
    }

    increment = size;

    while(TRUE) {
        increment = (int)(increment / LAPSE_RATE);
        for(i = 0; i < increment; i++) {
            for(j = i+increment; j < size; j += increment) {
                if(array[j] < array[j-increment]) {
                    Swap(array+j, array+j-increment);
                }
            }
        }

        if(increment <= 1) {
            break;
        }
    }   

    return TRUE;
}
    原文作者:排序算法
    原文地址: https://blog.csdn.net/u010647471/article/details/50170825
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞