梳排序算法

梳排序(Comb sort)是一种由Wlodzimierz Dobosiewicz于1980年所发明的不稳定排序算法,并由Stephen Lacey和Richard Box于1991年四月号的Byte杂志中推广。梳排序是改良自冒泡排序和快速排序。

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

梳排序算法

使用梳排序为一列数字进行排序的过程

本文地址:http://www.cnblogs.com/archimedes/p/comb-sort-algorithm.html,转载请注明源地址。

例:        88     7     79     64     55     98     48     52     4      13             

第一趟:    gap=10/1.24=8

比较数值对: (88, 4), (7, 13)

结果为:   4      7     79     64     55     98     48     52     88     13 

第二趟:   gap=8/1.24=6

比较数值对: (4, 48), (7, 52), (79, 88), (64, 13)

结果为:   4      7     79     13     55     98     48     52     88     64

第三趟:   gap=6/1.24=4

比较数值对: (4, 55), (7, 98), (79, 48)  交换后:4      7     48     13     55     98     79     52     88     64 

继续比较数值对:(13, 52), (55, 88), (98, 64)

结果为:   4      7     48     13     55     64     79     52     88     98

第四趟:   gap=4/1.24=3

比较数值对: (4, 13), (7, 55), (48, 64), (13, 79), (55, 52), (64, 88), (79, 98)

结果为:   4      7     48     13     52     64     79     55     88     98

第五趟:   gap=3/1.24=2

比较数值对: (4, 48), (7, 13), (48, 52), (13, 64), (52, 79), (64, 55), (79, 88), (55, 98),

结果为:   4      7     48     13     52     55     79     64     88     98

第六趟:   gap=2/1.24=1

比较数值对: (4, 7), (48, 13), (52, 55), (79, 64), (88, 98)

结果为:   4      7     13     48     52     55     64     79     88     98

算法实现:

// Completed on 2014.10.8 21:27
// Language: C99
//
// 版权所有(C)codingwu   (mail: oskernel@126.com) 
// 博客地址:http://www.cnblogs.com/archimedes/

#include<stdio.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;
}
上一篇:养猪日记 2022.2.18


下一篇:GMOJ.1002【USACO题库】1.1.3 Friday the Thirteenth黑色星期五