数据结构学习笔记 --- 排序(Gnome排序、梳排序)

原创 2012年03月26日 22:17:54
1. Gnome排序 是插入排序的变形,唯一的区别在于它是使用类似冒泡排序的Swap方法将选择出来的元素移动到合适的位置。也因此它是Stable的排序算法。
其思想如下:
Gnome Sort is based on the technique used by the standard Dutch Garden Gnome (Du.: tuinkabouter). Here is how a garden 
gnome sorts a line of flower pots. Basically, he looks at the flower pot next to him and the previous one; if they are 
in the right order he steps one pot forward, otherwise he swaps them and steps one pot backwards. Boundary conditions: 
if there is no previous pot, he steps forwards; if there is no pot next to him, he is done. 

其代码仅五行:
void gnomesort(int n, int ar[]) {
 int i = 0;
 while (i < n) {
  if (i == 0 || ar[i-1] <= ar[i]) i++;
  else {int tmp = ar[i]; ar[i] = ar[i-1]; ar[--i] = tmp;}
 }
}

时间复杂度为O(n^2),空间复杂度为O(1)。

2. Comb Sort,梳排序或者梳子排序,就像梳子那样有间隔地比较两个数,很形象,O(n*logn)时间复杂度,O(1)空间复杂度,属于不稳定的排序算法。算法的思想是使逆序的元素尽可能快地移动到最终的位置,而不是像冒泡排序那样每次交换只移动一个位置。

void combsort(int *arr, int size) {
  float shrink_factor = 1.247330950103979;
  int gap = size, swapped = 1, swap, i;
 
  while ((gap > 1) || swapped) {
    if (gap > 1) gap = gap / shrink_factor;
 
    swapped = 0; 
    i = 0;
 
    while ((gap + i) < size) {
      if (arr[i] - arr[i + gap] > 0) {
        swap = arr[i];
        arr[i] = arr[i + gap];
        arr[i + gap] = swap;
        swapped = 1;
      }
      ++i;
    }
  }
}

假设输入为

8 4 3 7 6 5 2 1

目标为将之变成递增排序。 因为输入长度=8,开始时设定间距为8÷1.3≒6, 则比较8和2、4和1,并作交换两次。

8 4 3 7 6 5 2 1
4 3 7 6 5 8 1
2 1 3 7 6 5 8 4

第二次循环,更新间距为6÷1.3≒4。比较2和6、1和5,直至7和4,此循环中只须交换一次。

2 1 3 7 6 5 8 4
2 1 3 4 6 5 8 7

接下来的每次循环,间距依次递减为3 → 2 → 1,

间距=3时,不须交换

2 1 3 4 6 5 8 7

间距=2时,不须交换

2 1 3 4 6 5 8 7

间距h=1时,交换三次

2 1 3 4 6 5 8 7
1 2 3 4 6 5 8 7
1 2 3 4 5 6 8 7
1 2 3 4 5 6 7 8

上例中,共作了六次交换以完成排序。

#include "ds.h"

#define 	MAX_LENGTH 	8
//#define		GNOMESORT


void print_array(int *a, int n) {  
    int i;  
    for ( i = 0; i < MAX_LENGTH; i++ ) {  
        printf("%d ", a[i]);  
    }  
    printf("\n");  
}  


void gnomesort(int ar[],int n) {
 int i = 0;
 while (i < n) {
  if (i == 0 || ar[i-1] <= ar[i]) i++;
  else {int tmp = ar[i]; ar[i] = ar[i-1]; ar[--i] = tmp;}
 }
}

void combsort(int *arr, int size) {
 
  float shrink_factor = 1.247330950103979;
  int gap = size, swapped = 1, swap, i;
 
  while ((gap > 1) || swapped) {
    if (gap > 1) gap = gap / shrink_factor;
 
    swapped = 0; 
    i = 0;
 
    while ((gap + i) < size) {
      if (arr[i] - arr[i + gap] > 0) {
        swap = arr[i];
        arr[i] = arr[i + gap];
        arr[i + gap] = swap;
        swapped = 1;
      }
      ++i;
    }
  }
}

int main(void) {  
int a[MAX_LENGTH] = {8, 4, 3, 7, 6, 5, 2, 1};
    printf("before sorting:\n");  
    print_array(a, MAX_LENGTH);
#ifdef GNOMESORT
	gnomesort(a, MAX_LENGTH);
#else
    combsort(a, MAX_LENGTH);  
#endif
   	printf("after sorting:\n");  
    print_array(a, MAX_LENGTH);  
    return 0;  
}  



排序算法之梳排序

排序算法之梳排序     基本思想:梳排序和希尔排序很类似。希尔排序是在直接插入排序的基础上做的优化,而梳排序是在冒泡排序的基础上做的优化。也是想希尔排序一样,将待排序序列通过增量分为若干个子序列,然...
  • u010647471
  • u010647471
  • 2015年12月04日 09:50
  • 720

梳排序(Comb sort)

梳排序(Comb sort)是一种由Wlodzimierz Dobosiewicz于1980年所发明的不稳定排序算法,并由Stephen Lacey和Richard Box于1991年四月号的Byte...
  • heyuchang666
  • heyuchang666
  • 2016年01月21日 12:09
  • 761

梳排序Linux下c 实现

梳排序改良自冒泡排序和快速排序,是不稳定排序算法。梳排序的递减率关系着算法的效率,递减率常常使用1.3,也有人提议用1.247330950103979。下面给出关键代码:            1、...
  • love__coder
  • love__coder
  • 2012年09月18日 15:11
  • 2241

经典算法题每日演练——第二十四题 梳排序

这篇再看看一个经典的排序,梳排序,为什么取名为梳,可能每个梳都有自己的gap吧,大梳子gap大一点,小梳子gap小一点。 上一篇我们看到鸡尾酒排序是在冒泡排序上做了一些优化,将单向的比较变成了双向,...
  • huangxinchen520
  • huangxinchen520
  • 2017年03月22日 17:07
  • 130

Comb Sort(梳排序,梳子排序)

首先说明该排序算法是抄维基百科的http://zh.wikipedia.org/zh-cn/%E6%A2%B3%E6%8E%92%E5%BA%8F 梳排序(Comb sort)是一种由Wlodzimi...
  • yui
  • yui
  • 2010年10月21日 18:45
  • 3469

排序高级之交换排序_梳排序

梳排序(Comb sort)是一种由Wlodzimierz Dobosiewicz于1980年所发明的不稳定排序算法,并由Stephen Lacey和Richard Box于1991年四月号的By...
  • u012959829
  • u012959829
  • 2015年01月06日 17:26
  • 591

经典排序算法 - 梳排序Comb sort

经典排序算法 - 梳排序Comb sort 梳排序还是基于冒泡排序,与冒泡不同的是,梳排序比较的是固定距离处的数的比较和交换,类似希尔那样 这个固定距离是待排数组长度除以1.3得到近似值,下次则以...
  • u014723529
  • u014723529
  • 2014年12月16日 11:57
  • 1067

排序专题(五) / 不稳定的内部排序 / 梳排序(Comb Sort)

时间复杂度:O(nlogn)梳排序改良自冒泡排序和快速排序,其旨在于消除乌龟,即在阵列尾部的小数值,这些数值是造成泡沫排序缓慢的主因。相对地,兔子,即在阵列前端的大数值,不影响冒泡排序的效能。在冒泡排...
  • SecondJanuary
  • SecondJanuary
  • 2013年01月30日 16:45
  • 582

排序算法总结

在工作中,用到了排序。顺便总结了一下。以下排序的各算法,我都验证无误。 包含冒泡排序、摇动排序、梳子排序、标准插入排序、优化的插入排序、 希尔排序、标准归并排序、优化的归并排序、 标准快速排序、...
  • dbyoung
  • dbyoung
  • 2012年10月18日 17:07
  • 3428

数据结构&算法实践—【排序|交换排序】梳子排序

转载请注明出处:http://blog.csdn.net/wklken 回主目录 排序>>交换排序>>梳子排序 List: 0.概念+伪代码+示例分析 1.梳...
  • wklken
  • wklken
  • 2012年05月17日 23:54
  • 2071
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:数据结构学习笔记 --- 排序(Gnome排序、梳排序)
举报原因:
原因补充:

(最多只允许输入30个字)