号称最简单的排序算法,只有一层循环,默认情况下前进冒泡,一旦遇到冒泡的情况发生就往回冒,直到把这个数字放好为止

直接看它排序的过程,待排数组[6 2 4 1 5 9]

先设计一个标识i=0然后从头开始判断,什么时候(i < 6)不成立,什么时候排序结束,

所以,如何控制i的值是这个算法的关键

例如待排数组:

[6 2 4 1 5 9]

[0 1 2 3 4 5]

看一下具体的排序过程

[ i = 0 ]时啥也不干,先让i自增1,达到值为1才开始真正的比较

交换前[6 2 4 1 5 9][ i = 0]

交换后[6 2 4 1 5 9][ i = 1]

[ i = 1 ]比较6和2,发生交换,只要发生交换i就减1

交换前[6 2 4 1 5 9][ i = 1]

交换后[2 6 4 1 5 9][ i = 0]

[ i = 0 ]又成0了,啥也不干,自增变成1再说

交换前[2 6 4 1 5 9][ i = 0]

交换后[2 6 4 1 5 9][ i = 1]

[ i = 1 ]再比较2和6,不交换,只要不要换就自增1

交换前[2 6 4 1 5 9][ i = 1]

交换后[2 6 4 1 5 9][ i = 2]

[ i = 2 ]比较6和4,发生交换,只要交换就减1

交换前[2 6 4 1 5 9][ i = 2]

交换后[2 4 6 1 5 9][ i = 1]

[ i = 1 ]比较2和4,不交换,只要不交换就自增1

交换前[2 4 6 1 5 9][ i = 1]

交换后[2 4 6 1 5 9][ i = 2]

[ i = 2 ]比较4和6,不交换,只要不交换就自增1

交换前[2 4 6 1 5 9][ i = 2]

交换后[2 4 6 1 5 9][ i = 3]

[ i = 3 ]比较6和1,交换,只要交换就减1

交换前[2 4 6 1 5 9][ i = 3]

交换后[2 4 1 6 5 9][ i = 2]

[ i = 2 ]比较4和1,交换,只要交换就减1

交换前[2 4 1 6 5 9][ i = 2]

交换后[2 1 4 6 5 9][ i = 1]

[ i = 1 ]比较2和1,交换,只要交换就减1

交换前[2 1 4 6 5 9][ i = 1]

交换后[1 2 4 6 5 9][ i = 0]

[ i = 0 ]时啥也不干,先让i自增1,达到值为1才开始真正的比较

交换前[1 2 4 6 5 9][ i = 0]

交换后[1 2 4 6 5 9][ i = 1]

[ i = 1]比较1和2,不交换,只要不交换就自增1

[ i = 2]比较2和4,不交换,只要不交换就自增1

[ i = 3]比较4和6,不交换,只要不交换就自增1

[ i = 4]比较6和5,交换,只要交换就减1

交换前[1 2 4 6 5 9][ i = 4]

交换后[1 2 4 5 6 9][ i = 3]

[ i = 3]比较4和5,不交换,只要不交换就自增1

[ i = 4]比较5和6,不交换,只要不交换就自增1

[ i = 5]比较6和9,不交换,只要不交换就自增1

[ i = 6]表达式(i < n)不成立,排序结束,

顺序输出结果即可:[ 1 2 4 5 6 9]

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;}

}

}

参考http://blog.csdn.net/winark/article/details/5918944

经典排序算法(十二)--地精排序Gnome Sort相关推荐

  1. 10大排序算法之二:冒泡排序【稳定的】,但复杂度高,一般不用冒泡排序的

    10大排序算法之二:冒泡排序[稳定的],但复杂度高,一般不用冒泡排序的 提示:整个算法界,一共有十大排序算法,每一个算法都要熟悉,才算是算法入门 算法界的十大排序算法分别是: 选择排序.冒泡排序.插入 ...

  2. 排序算法——十大排序算法的图示与实现

    十大排序算法概览 比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此也称为非线性时间比较类排序. 非比较类排序:不通过比较来决定元素间的相对次序,它可以突破基于 ...

  3. 齐姐漫画:排序算法(二)

    归并排序 那我们借用 cs50 里的例子,比如要把一摞卷子排好序,那用并归排序的思想是怎么做的呢? 首先把一摞卷子分成两摞: 把每一摞排好序: 把排好序的两摞再合并起来. 感觉啥都没说? 那是因为上面 ...

  4. 排序算法 - 面试中的排序算法总结

    排序算法总结 查找和排序算法是算法的入门知识,其经典思想可以用于很多算法当中.因为其实现代码较短,应用较常见.所以在面试中经常会问到排序算法及其相关的问题.但万变不离其宗,只要熟悉了思想,灵活运用也不 ...

  5. 《数据结构与算法》实验:排序算法实验比较——选择排序 堆排序

    <数据结构与算法>实验和课程Github资源 <数据结构与算法>实验:线性结构及其应用--算术表达式求值 <数据结构与算法>实验:树型结构的建立与遍历 <数据 ...

  6. java 奇偶数据排序算法,简单讲解奇偶排序算法及在Java数组中的实现

    简单讲解奇偶排序算法及在Java数组中的实现 奇偶排序是一个比较有个性的排序,基本思路是奇数列排一趟序,偶数列排一趟序,再奇数排,再偶数排,直到全部有序 举例吧, 待排数组 [6 2 4 1 5 9] ...

  7. Java常见排序算法之直接选择排序

    在学习算法的过程中,我们难免会接触很多和排序相关的算法.总而言之,对于任何编程人员来说,基本的排序算法是必须要掌握的. 从今天开始,我们将要进行基本的排序算法的讲解.Are you ready?Let ...

  8. php递归算法排序,php常用的排序算法代码[冒泡,递归排序-PHP源码

    <script>ec(2);<script> php 常用的排序算法代码[冒泡,递归排序 冒泡排序算法 function bubblesort($arr) { $n=count ...

  9. 数据结构之排序算法:并归排序

    排序算法:并归排序 思维导图: 归并排序的定义: 俩个有序线性表的合并: 归并排序的代码实现: 归并排序的性能: 思维导图: 归并排序的定义: 俩个有序线性表的合并: int *B = (int *) ...

  10. 排序算法:简单选择排序算法实现及分析

    简单选择排序算法介绍 简单选择排序(Simple Selection Sort)就是通过n-1次关键字排序之间的比较,从n-i+1个记录中选择关键字最小的记录,并和第i(1<=i<=n)记 ...

最新文章

  1. 使用Hyperledger Ursa简化区块链安全性
  2. mysql编写中文时变成问号解决方法
  3. 面向对象的多态性(2)
  4. com.alibaba.druid.sql.parser.ParserException: syntax error, QUES %, pos 80 like报错解决
  5. 故宫的“烧脑奇书”又火了!豆瓣9.2分,11种结局,可以玩一年!
  6. 【软件测试】结构化分支和循环语句的白盒测试
  7. Python函数默认值参数的2个坑
  8. 带有拉普拉斯平滑的Naive Bayes python代码实现
  9. 人工智能的认知技术,主要包含哪些?
  10. MC9S中断函数编写
  11. 局域网架设 NOD 32 镜像更新服务器
  12. 最新麦子学院嵌入式开发系列培训教程
  13. bzoj 1127 [POI2008]KUP——思路(悬线法)
  14. 贾又福大象鸿蒙,2016贾又福工作室师生优秀作品全国巡展
  15. Android学习之RecyclerView的使用
  16. 《等着我吧,我会回来》 苏·西蒙诺夫
  17. UX、UI、 IA和IxD傻傻分不清
  18. spring动态代理
  19. 使用Vue和Spring Boot实现文件下载
  20. weblogic异常崩溃导致文件AdminServer.lok被锁启动报错问题处理方法

热门文章

  1. dijit.layout.ContentPane--dojo学习
  2. 深入理解java:线程本地变量 java.lang.ThreadLocal类
  3. Django 分页器 缓存 信号 序列化
  4. ftrace 的使用【转】
  5. 微软Azure、谷歌GAE、亚马逊AWS比較
  6. centos6.5下编译安装mariadb-10.0.20
  7. 思科 GNS3 配置 链路捆绑
  8. GEF:使用Draw2D画流程图-(下)
  9. Linq之ToDictionaryTSource, TKey, TElement用法
  10. 3. AJAX 请求与响应