地精排序Gnome Sort
2016-01-21 11:37
387 查看
地精排序Gnome Sort
号称最简单的排序算法,只有一层循环,默认情况下前进冒泡,一旦遇到冒泡的情况发生就往回冒,直到把这个数字放好为止。地精算法总是发现第一个 【两个相邻元素存在错误的顺序】,然后把他们交换。原理是,交换一对乱序元素后,会产生一对新的无序相邻元素,而这两个元素要么交换前有序,要么交换后有序。它不认为元素当前的位置是有序的,所以它只需要在交换元素前直接检查位置。
直接看它排序的过程,待排数组[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]
以下代码仅供参考
号称最简单的排序算法,只有一层循环,默认情况下前进冒泡,一旦遇到冒泡的情况发生就往回冒,直到把这个数字放好为止。地精算法总是发现第一个 【两个相邻元素存在错误的顺序】,然后把他们交换。原理是,交换一对乱序元素后,会产生一对新的无序相邻元素,而这两个元素要么交换前有序,要么交换后有序。它不认为元素当前的位置是有序的,所以它只需要在交换元素前直接检查位置。
直接看它排序的过程,待排数组[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]
以下代码仅供参考
static void gnome_sort(int[] unsorted) { int i = 0; while (i < unsorted.Length) { if (i == 0 || unsorted[i - 1] <= unsorted[i]) { i++; } else { int tmp = unsorted[i]; unsorted[i] = unsorted[i - 1]; unsorted[i - 1] = tmp; i--; } } }
相关文章推荐
- Android开发中无处不在的设计模式——动态代理模式
- Android ImageCache图片缓存,使用简单,支持预取,支持多种缓存算法,支持不同网络类型,扩展性强
- 谈谈APP架构选型:React Native还是HBuilder
- RabbitMQ(pika模块)
- 推挽输出与开漏输出
- xutils 注册 控件转换异常信息处理
- Python 装饰器
- Java程序中加载文件和动态链接库
- iOS黑魔法-Method Swizzling
- postman测试web服务时添加json类型的参数
- 发现/var/log下没有cron的日志怎么办?
- 关于GridView
- Delphi使用JSON
- HttpClientHandler
- 读取SequenceFile中自定义Writable类型值
- Linux 中使用pkill踢出在线用户的方法
- Endnote安装完成后,word2013工具栏不显示解决方法
- freemarker list 的嵌套问题
- App版本更新时对SQLite数据库升级或者降级遇到的问题
- java List 排序 Collections.sort()