Gnome排序算法
Gnome排序(地精排序),起初由Hamid Sarbazi-Azad 于2000年提出,并被称为stupid排序,后来被Dick Grune描述并命名为“地精排序”,作为一个排序算法,和插入排序类似,除了移动一个元素到最终的位置,是通过交换一系列的元素实现,就像冒泡排序一样。概念上十分简单,不需要嵌套循环。时间复杂度为O(n2),但是如果初始数列基本有序,时间复杂度将降为O(n)。实际上Gnome算法可以和插入排序算法一样快。平均运行时间为O(n2).
Gnome排序算法总是查找最开始逆序的一对相邻数,并交换位置,基于交换两元素后将引入一个新的相邻逆序对,并没有假定当前位置之后的元素已经有序.
本文地址:http://www.cnblogs.com/archimedes/p/gnome-sort-algorithm.html,转载请注明源地址。
下面gnome排序算法的伪代码,使用0起始索引数组:
procedure gnomeSort(a[])
pos :=
while pos < length(a)
if (a[pos] >= a[pos-])
pos := pos +
else
swap a[pos] and a[pos-]
if (pos > )
pos := pos -
end if
end if
end while
end procedure
实例
给定一个无序数组, a = [5, 3, 2, 4], gnome排序将在while循环中执行如下的步骤. "current position"采用加粗黑体:
| 当前数组 | 操作 |
|---|---|
| [5, 3, 2, 4] | a[pos] < a[pos-1], 交换: |
| [3, 5, 2, 4] | a[pos] >= a[pos-1], pos自增: |
| [3, 5, 2, 4] | a[pos] < a[pos-1], 交换并且pos > 1, pos自减: |
| [3, 2, 5, 4] | a[pos] < a[pos-1], 交换并且pos <= 1, pos自增: |
| [2, 3, 5, 4] | a[pos] >= a[pos-1], pos自增: |
| [2, 3, 5, 4] | a[pos] < a[pos-1], 交换并且pos > 1, pos自减: |
| [2, 3, 4, 5] | a[pos] >= a[pos-1], pos自增: |
| [2, 3, 4, 5] | a[pos] >= a[pos-1], pos自增: |
| [2, 3, 4, 5] | pos == length(a), 完成. |
C代码如下:
// Completed on 2014.10.9 10:01
// 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 = ; i < count; i++)
printf("%d ",a[i]);
printf("\n");
} void gnome_sort(int *a, int len) //gnome排序算法
{
int pos = ;
while(pos < len) {
if(a[pos] >= a[pos - ]) {
pos++;
} else {
swap(&a[pos], &a[pos - ]);
if(pos > ) pos--;
}
}
} int main(void)
{
int a[] = {, , , , , , , , };
int n = sizeof(a) / sizeof(*a);
printArray(a, n);
gnome_sort(a, n);
printArray(a, n);
return ;
}
优化:
gnome算法还可以通过引入一个变量,用于存储每次返回到数组前面的位置来进行优化。采用这样的优化,gnome排序将成为一个变种插入排序,下面优化后gnome排序算法的伪代码,使用0起始索引数组:
procedure optimizedGnomeSort(a[])
pos :=
last :=
while pos < length(a)
if (a[pos] >= a[pos-])
if (last != )
pos := last
last :=
end if
pos := pos +
else
swap a[pos] and a[pos-]
if (pos > )
if (last == )
last := pos
end if
pos := pos -
else
pos := pos +
end if
end if
end while
end procedure
C代码如下:
// Completed on 2014.10.9 10:31
// 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 = ; i < count; i++)
printf("%d ",a[i]);
printf("\n");
}
void optimizedGnome_Sort(int *a, int len) //优化后的gnome排序
{
int last, pos;
last = ; pos = ;
while(pos < len) {
if(a[pos] >= a[pos - ]) {
if(last != ) {
pos = last;
last = ;
}
pos++;
} else {
swap(&a[pos], &a[pos - ]);
if(pos > ) {
if(last == )
last = pos;
pos--;
} else {
pos++;
}
}
}
}
int main(void)
{
int a[] = {, , , , , , , , };
int n = sizeof(a) / sizeof(*a);
printArray(a, n);
optimizedGnome_Sort(a, n);
printArray(a, n);
return ;
}
获取更多C语言与算法相关知识,关注公众号:“csuanfa”

Gnome排序算法的更多相关文章
- Gnome排序
Gnome排序(地精排序),起初由Hamid Sarbazi-Azad 于2000年提出,并被称为stupid排序,后来被Dick Grune描述并命名为“地精排序”,作为一个排序算法,和插入排序类似 ...
- 地精排序(Gnome Sort) 算法
gnome应该是最简单排序的排序算法吧!Gnome Sort,这是该算法的作者命名的,O(n*n)时间复杂度,O(1)空间复杂度,属于稳定的排序算法.算法的思想是每趟循环找到第一个逆序的元素,把它和在 ...
- 【Unity3D自学记录】可视化对照十多种排序算法(C#版)
在这篇文章中.我会向大家展示一些排序算法的可视化过程.我还写了一个工具.大家可对照查看某两种排序算法. 下载源代码 – 75.7 KB 下载演示样例 – 27.1 KB 引言 首先,我觉得是最重要的是 ...
- JavaScript实现常用的排序算法
▓▓▓▓▓▓ 大致介绍 由于最近要考试复习,所以学习js的时间少了 -_-||,考试完还会继续的努力学习,这次用原生的JavaScript实现以前学习的常用的排序算法,有冒泡排序.快速排序.直接插入排 ...
- 排序算法----基数排序(RadixSort(L))单链表智能版本
转载http://blog.csdn.net/Shayabean_/article/details/44885917博客 先说说基数排序的思想: 基数排序是非比较型的排序算法,其原理是将整数按位数切割 ...
- 常见排序算法(附java代码)
常见排序算法与java实现 一.选择排序(SelectSort) 基本原理:对于给定的一组记录,经过第一轮比较后得到最小的记录,然后将该记录与第一个记录的位置进行交换:接着对不包括第一个记录以外的其他 ...
- 几大排序算法的Java实现
很多的面试题都问到了排序算法,中间的算法和思想比较重要,这边我选择了5种常用排序算法并用Java进行了实现.自己写一个模板已防以后面试用到.大家可以看过算法之后,自己去实现一下. 1.冒泡排序:大数向 ...
- 排序算法----基数排序(RadixSort(L,max))单链表版本
转载http://blog.csdn.net/Shayabean_/article/details/44885917博客 先说说基数排序的思想: 基数排序是非比较型的排序算法,其原理是将整数按位数切割 ...
- 排序算法汇总(C/C++实现)
前言: 本人自接触算法近2年以来,在不断学习中越多地发觉各种算法中的美妙.之所以在这方面过多的投入,主要还是基于自身对高级程序设计的热爱,对数学的沉迷.回想一下,先后也曾参加过ACM大大小小的 ...
随机推荐
- [转]Visual Studio技巧之打造拥有自己标识的代码模板
可能经过很多博客的介绍,大家都知道代码段的使用,使用代码段可以很方便地生成一些常用的代码格式,确实对我们开发很方便.在团队开发中或者在某些情况下我们经常可能还会希望使用Visual Studio生成的 ...
- [Git] Git 常用技巧
版本对比 1. 对比两个 COMMIT git diff <commit> <commit> 2. 对比 COMMIT 和父 COMMIT git diff <commi ...
- mysql提示:Illegal mix of collations for operation ‘UNION’
http://www.111cn.net/database/mysql/56096.htm show variables like "%char%"; show variables ...
- DDD:Strategic Domain Driven Design with Context Mapping
Introduction Many approaches to object oriented modeling tend not to scale well when the application ...
- Android 学习笔记之Volley开源框架解析(四)
学习内容: 1.NetWorkDispatcher网络请求线程调度... 2.NetWork网络请求抽象类... 3.BasicNetWork网络请求抽象类的具体实现... 4.NetWorkResp ...
- SQL Server 2005 Service Broker
一.引言 SQL Server 2005 的一个主要成就是可以实现可靠.可扩展且功能完善的数据库应用程序.与 .NET Framework 2.0 公共语言运行库 (CLR) 的集成使开发人员可以将重 ...
- 软件工程---阅读《构建之法》P384~391
-阅读<构建之法>P384~391后,我充分认识到软件工程师的职业道德的重要性,具体有: 原则1:公众 原则2:客户与雇主 原则3:产品 原则4:判断 原则5:管理 原则6:职业 原则7: ...
- 数论 - 简单数位推理 --- NYIST 514
Problem's Link:http://acm.nyist.net/JudgeOnline/problem.php?pid=514 Mean: 给你一个l和r,求出在这个范围内的1的个数. ana ...
- [移动开发]全面理解UnityUI系统
随着 Unity 4.6 发布,新 UI 系统终于与大家见面了. RectTransform Unity UI 系统使用 RectTransform 实现基本的布局和层次控制.RectTransfor ...
- 【循序渐进学Python】11.常用标准库
安装完Python之后,我们也同时获得了强大的Python标准库,通过使用这些标准库可以为我们节省大量的时间.这里是一些常用标准库的简单说明.更多的标准库的说明,可以参考Python文档 sys 模块 ...