只有一重循环的排序——侏儒排序(Gnome Sort)
侏儒排序:从头(i=0)开始遍历元素,如果当前元素比前一个元素大(array[i]>array[i-1]),就把它跟前一个元素互换(Swap(a[i],a[i-1]))并继续检查它(i--),否则检查下一个元素(i++)。当i=length时结束排序。
该排序的神奇之处是只有一重循环,而且代码简单。但是一重循环不代表时间复杂度更小,它的时间复杂度依然是O(n^2),原因就在于代码里的i--起到了和二次循环相同的效果。
优点:
1. 最好情况下时间复杂度低——O(n),一个循环跑下来始终i++,非常顺利。
2. 排序稳定,只交换相邻元素的排序都是稳定的。
3. 额外空间使用少,只需要i(记录进度)和t(交换缓存)。如果比较元素是数字,t都能省掉(不使用临时变量交换两个数字)。
缺点:
效率低。我们对比侏儒排序和直接插入排序。会发现这二者的排序思想一模一样,但是插入排序有2处优化是侏儒排序没做到的:
a. 插入排序遇到不匹配位置的新元素时,把前面的元素挨个后移,然后把新元素直接插入到合适位置(如果位置移动k位,则赋值k+1次)。而侏儒排序是把新元素逐个和前一个元素作交换,一路换位到合适位置,这是典型的冒泡做法(如果位置移动k位,则赋值3*k次)。
b. 当一个元素好不容易从第10位冒泡到第1位的时候,那么此时前10位一定是有序序列。插入排序会直接从第11位继续处理,而侏儒排序只能从第2位继续处理,因为它不知道上个元素是从哪个位置走到第1位的,只好多走冤枉路。
下面是C#代码:
void GnomeSort(List<int> a)
{int i = 0;while (i < a.Count){if (i == 0 || a[i - 1] <= a[i]){i++;}else{int t = a[i];a[i] = a[i - 1];a[i - 1] = t;i--;}}
}
当然,我们可以通过打补丁的方式来优化它,不过如果这么做了,我们干嘛不直接使用直接插入排序呢?作为直接插入排序的劣质版,它基本上没有实用价值,但是通过研究它,我们就能知道为什么直接插入排序能在这一众O(n^2)排序中脱颖而出了。
转载于:https://www.cnblogs.com/9-de/p/6600640.html
只有一重循环的排序——侏儒排序(Gnome Sort)相关推荐
- Go:Gnome sort 侏儒排序(附完整源码)
Go:Gnome sort 侏儒排序 package main/** Gnome sort*/ func GnomeSort(arr []int) {i := 1tmp := 0for ; i < ...
- GnomeSort(侏儒排序)——C语言实现
前言: 这真是我写过最简单的排序了,比冒泡还简单,小小排序有趣有趣. 这个排序在数组基本有序的情况下,时间复杂度可以达到O(n),确实是厉害的,让我们看看怎么写 思路: 基本上,他看着旁边的花盆和前一 ...
- Python 数据结构与算法——侏儒排序
侏儒排序作为排序算法的历史地位远不及对其进行时间复杂度分析的地位来得高. def gnomesort(l):i = 0while i < len(l):if i == 0 or l[i-1] & ...
- C++ gnome sort 侏儒排序的实现算法(附完整源码)
C++gnome sort 侏儒排序的实现算法 C++gnome sort 侏儒排序的实现算法完整源码(定义,实现,main函数测试) C++gnome sort 侏儒排序的实现算法完整源码(定义,实 ...
- C语言侏儒排序Gnome sort 算法(附完整源码)
侏儒排序Gnome sort 算法 侏儒排序Gnome sort 算法的完整源码(定义,实现,main函数测试) 侏儒排序Gnome sort 算法的完整源码(定义,实现,main函数测试) #inc ...
- Python:实现gnome sortt侏儒排序算法(附完整源码)
Python:实现gnome sortt侏儒排序算法 def gnome_sort(lst: list) -> list:if len(lst) <= 1:return lsti = 1w ...
- C#:实现gnome sort 侏儒排序算法(附完整源码)
C#:实现gnome sort 侏儒排序算法 下面是 C# 语言实现的侏儒排序算法的源代码: public static void GnomeSort(int[] arr) {int i = 1;in ...
- JAVA:实现 gnome sort侏儒排序算法(附完整源码)
JAVA:实现 gnome sort侏儒排序算法 package com.thealgorithms.sorts;import static com.thealgorithms.sorts.SortU ...
- C#实现侏儒排序算法
C#实现侏儒排序算法 侏儒排序算法,也称为gnome sort,是一种简单的排序算法.它通过逐个比较相邻的元素,如果它们没有按升序排列,则交换它们的位置,直到整个序列都被排序. 下面是C#代码实现侏儒 ...
最新文章
- 如何让人工智能更智能?你需要一个开源平台
- C#读写文本文件小结
- tomcat报错LifecycleException的解决方案
- MySQL临时表的操作使用
- php作品答辩问问题,一般答辩会问到什么问题
- [Java基础]线程基础与实现多线程
- 1144 The Missing Number (20 分)
- winform checkbox要点击两次_真正牛X的人生,必须经历两次失败!(深度)
- python 函数调用列表_python – 根据列表中的字符串调用函数
- Flex 与 Asp.Net 通过 Remoting 方式进行通讯 (三)
- 控制系统中对信号求导的注意事项
- C语言编程练习---2021山东理工大学ACM 实验一J---X题解
- java 场景面试题_Java面试场景整理收录
- Centos7 安装杀毒软件 Clamav
- 【Java SE】数组
- desc查询表字段信息
- 无线入侵检测和入侵防御(WIPDS)市场现状研究分析与发展前景预测报告
- sem竞价账户怎么提升效果提高转化
- 【R语言】他说每个生存曲线一定要看到p值,不能0.05,0.01,0.001
- “撒旦”勒索病毒再曝4.2变种 腾讯电脑管家文档守护者可一招解密
热门文章
- 教学|3DSMAX的mental ray皮肤,3S材质的制作和使用方法
- ECMAScript - GrammarⅠ
- 基于WIFI连接MAC绑定的点名及数据挖掘探究
- REPEATABLE-READ隔离级别 事务中无法读到其它事务提交了的最新数据
- 小哈智能机器人的功能_小哈智能教育机器人H2产品外观参数说明
- 在线EXCEL编辑器-Luckysheet
- 正则表达式和re模块
- 怎样才算是好程序员?关于好程序员与好代码的杂谈
- ADAS高级辅助驾驶视觉系统(Advanced Driver Assistant System)
- 国产CSM32RV20是基于RISC-V核的低功耗MCU芯片