`

梳排序

阅读更多

梳排序(Comb sort)是一种由Wlodzimierz Dobosiewicz于1980年所发明的不稳定排序算法,并由Stephen Lacey和Richard Box于1991年四月号的Byte杂志中推广。梳排序是改良自泡沫排序和快速排序,其要旨在于消除乌龟,亦即在阵列尾部的小数值,这些数值是造成泡沫排序缓慢的主因。相对地,兔子,亦即在阵列前端的大数值,不影响泡沫排序的效能。

在泡沫排序中,只比较阵列中相邻的二项,即比较的二项的间距(Gap)是1,梳排序提出此间距其实可大于1,改自插入排序的希尔排序同样提出相同观点。梳排序中,开始时的间距设定为阵列长度,并在循环中以固定比率递减,通常递减率设定为1.3。在一次循环中,梳排序如同泡沫排序一样把阵列从首到尾扫描一次,比较及交换两项,不同的是两项的间距不固定于1。如果间距递减至1,梳排序假定输入阵列大致排序好,并以泡沫排序作最后检查及修正。

递减率

递减率的设定影响着梳排序的效率,原作者以随机数作实验,得到最有效递减率为1.3的。如果此比率太小,则导致一循环中有过多的比较,如果比率太大,则未能有效消除阵列中的乌龟。

亦有人提议用1/\left(1-\frac{1}{e^\varphi}\right) \approx 1.247330950103979作递减率,同时增加换算表协助于每一循环开始时计算新间距。

变异形式

梳排序-11

设定递减率为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(Combsort11)。

混合梳排序和其他排序算法

如同快速排序和合并排序,梳排序的效率在开始时最佳,接近结束时,即进入泡沫排序时最差。如果间距变得太小时(例如小于10),改用诸如插入排序或鸡尾酒排序等算法,则可提升整体效能。

此方法的最大好处是不再需要检查有否进行过交换程序以将排序循环提早结束。

#include<stdio.h>    
#include<string.h>   
#include<math.h>   
#include<ctype.h>   
#include<stdbool.h>  

void swap(int *a, int *b)   //交换两元素的值
{
    int t;
    t=*a;
    *a=*b;
    *b=t;
}

void printArray(int a[], int count)   //打印数组元素
{
    int i;
    for(i=0; i<count; i++)
        printf("%d ",a[i]);
    printf("\n");
}

void combsort(int *a, int size) 
{
 
  float shrink_factor = 1.247330950103979;   //设置递减率
  int gap = size, i;
  bool swapped = true;
 
  while ((gap > 1) || swapped) {  //当gap=1时,已经基本有序, swapped最后一次遍历排序
    if (gap > 1) gap = gap / shrink_factor;
    swapped = false; 
    i = 0;
    while ((gap + i) < size) {
      if (a[i] > a[i + gap]) {
        swap(&a[i],&a[i + gap]);
        swapped = true;
      }
      ++i;
    }
  }
}

int main(void)   
{
    int a[]={3, 5, 4, 6, 9, 7, 8, 0, 1};
    int n=sizeof(a)/sizeof(*a);
    printArray(a,n);
    combsort(a,n);
    printArray(a,n);
    return 0;
}

 

分享到:
评论

相关推荐

    基于C语言的排序方法汇总

    本文将详细介绍几种常见的排序算法,包括冒泡排序、梳排序、堆排序、归并排序、简单排序、快速排序、桶排序以及基数排序。我们将讨论每种算法的原理、时间复杂度,并给出相应的C语言实现。 1. 冒泡排序:冒泡排序是...

    易语言数组排序算法集合

    本资源“易语言数组排序算法集合”提供了多种常见的排序算法的源代码实现,对于学习易语言以及算法理解都有极大的帮助。下面将详细介绍其中提及的几种排序算法。 1. **冒泡排序**: 冒泡排序是最基础的排序算法之...

    python 实现 排序 课程设计 代码

    梳排序(Comb Sort) 计数排序(Counting Sort) 循环排序(Cycle Sort) 双重排序(Double Sort) 荷兰国旗排序(Dutch National Flag Sort) 交换排序(Exchange Sort) 外部排序(External Sort) 侏儒排序...

    经典算法的C#源码实现

    经典的排序算法C#源码,包括: 经典排序算法 - 快速排序Quick ...经典排序算法 - 梳排序Comb sort 经典排序算法 - 耐心排序Patience Sorting 经典排序算法 - 珠排序Bead Sort 经典排序算法 - 计数排序Counting sort

    各种排序算法性能比较-E01114300.doc

    本报告主要关注四种经典的排序算法——插入排序、冒泡排序、快速排序以及梳排序,对它们的性能进行了比较。以下是这四种排序算法的详细解释和性能分析: 1. **插入排序**: 插入排序是一种简单直观的排序算法,它...

    各种排序算法性能比较_顾云康E01114300.doc

    在本课程设计中,顾云康同学通过比较不同的排序算法,包括快速排序、冒泡排序、插入排序和梳排序,来研究它们在处理相同数量级数据时的性能差异。这是一项旨在提升C语言编程技能、理解和应用数据结构及算法、以及...

    排序算法c实现代码模块

    梳排序是插入排序的一种改进版本,基本思想是利用“步长”逐步递减的方式来对数组进行排序。初始时,步长设为数组长度,然后逐渐减小,直到最后变为 1,此时就变成了普通的插入排序。梳排序的时间复杂度最好可以达到...

    排序算法-基于C语言实现的排序算法之CombSort实现.zip

    本资源聚焦于一种相对不那么常见的排序算法——CombSort(梳排序)。 **CombSort算法** CombSort是一种改进的快速排序算法,由Glenn Sheila和Wendy Hall在1980年提出。它的主要思想是通过模拟梳子的动作来排序数组...

    16种排序算法比较与分析

    常见或不常见排序算法的比较! C语言实现. 40M内存10*1024*1024个整数 BoxSort 0.57s CountingSort 0.89s QuickSort 2.52s CombSort 5.03s ShellInsertSort 5.81s MergeSort 6.20s HeapSort 7.66s ...

    R语言算法集完整源码分享给需要的同学(含关联算法、分类算法、梯度提升算法、降维算法、回归算法、排序算法等等)

    ##关联算法 ##分类算法 ...*[二进制插入排序] *[气泡排序] *[桶排序] *[鸡尾酒类] *[梳子排序] *[计数排序] *[循环排序] *[堆排序](h *[插入排序] *[合并排序] *[奇偶排序] *[煎饼分类] *[快速排序] *

    易语言通用类型排序

    易语言通用类型排序源码,通用类型排序,取数据大小,强转_到文本,强转_到整数,强转_到字节集,调用子程序_,冒泡排序,改冒泡法,双向泡排序,双响泡排序,直接插入排序,地精排序,地精排序2,地精排序3,二分排序,选择排序,...

    C#十三种排序算法

    双向冒泡排序 冒泡排序 桶排序 梳排序 循环排序 地精排序 堆排序 插入排序 归并排序 奇偶排序 鸽笼排序 快速排序 使用冒泡的快排 选择排序 希尔排序 里面含源文件与编译后的文件.每个算法都有效率图.

    一些排序算法性能比较

    利用随机函数产生N个随机整数(20000以上),...排序算法 插入排序 冒泡排序 选择排序 堆排序 地精排序 希尔排序 梳排序 统计每一种排序方法的性能(以上机运行程序所花费的时间为准进行对比),找出其中两种较快的方法

    analysis-of-sorting-algorithms:用于分析5种排序算法的代码。 (梳,st,侏儒,双音,振动筛)

    在这个名为"analysis-of-sorting-algorithms"的项目中,我们主要关注的是五种不同的排序算法:梳排序(Comb Sort)、ST排序(Shell Sort)、侏儒排序(Dwarf Sort)、双音排序(Bogo Sort)以及振动筛排序(Sieve ...

    sorting_algorithm:Ruby中排序算法的教学模块

    在编程领域,排序算法是计算机科学中的核心概念,它用于对数据进行有序排列。这个名为"sorting_algorithm"的Ruby教学模块旨在提供一个全面的资源,帮助开发者理解和实践各种不同的排序算法。下面,我们将深入探讨...

    TI TVP5158四路NTSC(PAL)视频译码解决方案.docx

    CVBS解码使用五线自适应梳排序过滤器来减少交叉亮度和交叉色度伪像。同时,用户可以通过I2C主机端口接口控制视频特性,如对比度、亮度、饱和度和色相。 2. TVP5158EVM评估模块: TVP5158EVM评估模块旨在简化设置...

    【新】通用快速排序框架:高效、简洁、面对对象-易语言

    增加梳排序算法等算法,在排序算法方面有更多的选择: 排序器和排序算法严格分离,排序算法无法访问排序器中的数据,所以通常都是线程安全的。 支持面向对象排序: 10万数据测试排序无压力: 发散思维: 本程序可以...

    leetcode中国-Algorithm:本项目主要是讲解一些算法程序

    2)交换排序:(1)冒泡排序,(2)快速排序,(3)梳排序。   3)选择排序:(1)直接选择排序,(2)树形选择排序,(3)堆排序。   4)归并排序。   5)基数排序。   6)计数排序;桶排序。 (1)面试高级算法: (2)让CPU运行周期...

    欧拉公式求圆周率的matlab代码-algorithm:各种算法的实现

    欧拉公式各种算法的实现示例 C ++ ...合并排序 堆排序 梳子排序 基数排序 插入排序 其他种类 拟阵 拟阵上的贪婪算法 拟阵穿越 其他 尼姆 数学代数 代数计算(例如矩阵计算)的算法 队列 Toeplitz矩阵

Global site tag (gtag.js) - Google Analytics