梳排序

作者: 半天妖 | 来源:发表于2017-08-16 09:04 被阅读41次

参考维基百科

梳排序是Wlodzimierz Dobosiewicz于1980年发明的不稳定排序算法。梳排序改良自冒泡排序和快速排序,主要目的是消除冒泡排序中因为尾部小数值(乌龟)造成的排序缓慢问题。

冒泡排序中,尾部小数值称为乌龟,会严重影响排序性能;而头部的大数值称为兔子,对性能没影响

在冒泡排序中,只比较阵列中的相邻两项,即比较的gap=1,梳排序提出此间距可以大于1。在梳排序中,开始时的gap设置为阵列的长度,并在会圈中以固定的比例递减,通常递减率设定为1.3。在一次回圈中,梳排序如同冒泡排序一样,把阵列从头到尾扫描一次,以比较并交换两项,不同的是两项间距不为1,如果递减至1,梳排序假定输入阵列大致已经排序好了,并以冒泡排序最最后的验证。

希尔排序由插入排序优化而来,其思想也是插入排序中gap可以不为1

代码实现

void comb_sort(int arr[], int len) {
    double shrink_factor = 0.8;
    int gap = len, swapped = 1, i;
    int temp;
    while (gap > 1 || swapped) {
        if (gap > 1)
            gap *= shrink_factor;
        swapped = 0;
        for (i = 0; gap + i < len; i++)
            if (arr[i] > arr[i + gap]) {
                temp = arr[i];
                arr[i] = arr[i + gap];
                arr[i + gap] = temp;
                swapped = 1;
            }
    }
}

过程举例

举例:待排序序列为{8, 6, 5, 2, 1, 4, 3,7}
第一次
初始increment = 8/1.3 =6。分为子序列{8, 3}{6, 7}{5}{2}{1}{4}进行一趟冒泡排序,得到{3, 6, 5, 2, 1, 4, 8, 7}
第二次
increment = 6/1.3 = 4。分为子序列{3, 1}{6, 4}{5, 8}{2, 7}进行一趟冒泡排序,得到{1, 4, 5, 2, 3, 6, 8, 7}
第三趟
increment = 4/1.3 = 3,分为子序列{1, 2, 8}{4, 3, 7}{5, 6}进行一趟冒泡排序,得到{1, 3, 5, 2, 4, 6, 8, 7}
第四趟
increment = 3/1.3 = 2。分为子序列{1, 5, 4, 8}{3, 2, 6, 7}进行一趟冒泡排序,得到{1, 2, 4, 3, 5, 6, 8, 7}
第五趟
increment = 2/1.3 = 1。分为子序列{1, 2, 4, 3, 5, 6, 8, 7}进行一趟冒泡排序,得到{1, 2, 3, 4, 5, 6, 7, 8}

算法分析

  • 递减率的设定影响梳排序的效率,原作者以随机数实验,得到最有效的递减率为1.3
  • 设定递减率为1.3时,最终只会有三种不同的结果:(9, 6, 4, 3, 2, 1)、(10, 7, 5, 3, 2, 1)、或 (11, 8, 6, 4, 3, 2, 1),实验证明,如果间距编程9或10时,一律改为11对效率又明显的改善,原因是,如果间距曾经为9或10,则到间距编程1时,数值通常不是递增数列,故因此要经过几次冒泡修正。这种假如指定间距的变异算法称为梳排序-11
  • 与快排和归并排序一样,刚开始是效率很好,结尾时效率较差,如果间距变得太小时如小于10,改用插入或希尔等算法,可以提升整体性能。

动态过程

comb_sort.gif

相关文章

  • 高效排序算法-梳排序

    梳排序 原理:梳(comb)排序基于冒泡排序。每个梳都有自己的gap(间隙),或大或小。 目前我们已知的冒泡排序是...

  • 算法combSort()

    梳排序的基本思想:梳排序是在冒泡排序上再做优化的。梳排序是待排序列通过增量分为若干个子序列,然后对子序列进行冒泡排...

  • 梳排序

    参考维基百科 梳排序是Wlodzimierz Dobosiewicz于1980年发明的不稳定排序算法。梳排序改良自...

  • 梳啊梳啊梳

    头发太长了,就容易缠在一起梳不通。可是梳顺了头发,依然没有疏通心结。尴尬,伤心,难过还有迷茫,真的真的要到了被铲屎...

  • 写写-梳梳

    好久没写东西了,虽然自己不是个擅长写作的人,有些想法,许多都是些散珠子,未成串。这个简书激发我写东西的兴趣,大学时...

  • 一、悲莫悲兮生离别

    "一梳,梳到尾;二梳,白发齐眉;三梳,梳到儿孙满地,或者,一梳梳到头。两梳梳到尾。三梳梳到白发与齐眉。"喜娘喜悦的...

  • 一梳梳到尾

    一件作品制作的过程!就是给一件作品打磨筋骨!注入灵魂的过程!每件作品都是匠人思想的继承者!又是匠人技艺的宣扬者!所...

  • 花开堪折直须折

    “一梳梳到头,富贵不用愁;二梳梳到头,无病又无忧;三梳梳到头,多子又多寿……末梳梳到尾,永结同心佩。” “同心佩,...

  • 梳,梳子,梳理。无意之间进入这样一个神奇的写作世界,该从何处开始? 关于开始,有一说万事开头难,另有一说好的开始是...

  • 我能做什麼呢衹能在淺頌的沐春里馥郁一片碧海稻野凝蒸幾許醉火雲霞許你半生清澡浮華一梳梳尾二梳白髮齊眉嵌在梳木里的相思...

网友评论

      本文标题:梳排序

      本文链接:https://www.haomeiwen.com/subject/sewbrxtx.html