前言:

这真是我写过最简单的排序了,比冒泡还简单,小小排序有趣有趣。

这个排序在数组基本有序的情况下,时间复杂度可以达到O(n),确实是厉害的,让我们看看怎么写

思路:

基本上,他看着旁边的花盆和前一个花盆; 如果他们按照正确的顺序,他会向前迈出一个底池,否则他会将它们交换掉,并向后踩一个底池(这是百度百科的解释哈哈哈,我觉得很形象)

就是只考虑两个位置的有序,如果有序,下标前进;如果无序,交换两个的位置,并且下标后退。只需要注意的是由于是比较前一个位置,容易下标越界。

既然思路如此简单,直接上代码:

void GnomeSort(int *a,int length)
{int i = 1;while (i < length){if (a[i] >= a[i - 1] || i <= 0)i++;else{swap(&a[i], &a[i - 1]);i--;}}
}

这个算法虽说在最好情况下可以逼近O(n)的时间复杂度,但是在普遍情况下,i的回退其实就相当于第二层的循环,换句话说就是平常的时间复杂度是O(n^2)。而且这是低效的回退,因为每次回退只能回退1,我们当然可以利用一个数组来记录回退的位置(这和KMP算法是不是挺像的),但这样我们为什么不用直接插入排序呢?他有着同样的时间复杂度,并且效率很高。

借用一篇文章中的话:

插入排序遇到不匹配位置的新元素时,把前面的元素挨个后移,然后把新元素直接插入到合适位置(如果位置移动k位,则赋值k+1次)。而侏儒排序是把新元素逐个和前一个元素作交换,一路换位到合适位置,这是典型的冒泡做法(如果位置移动k位,则赋值3*k次)。

原文地址:只有一重循环的排序——侏儒排序(Gnome Sort) - 九德真君 - 博客园 (cnblogs.com)

因此,这个仅仅一重循环的排序算法还是有不少缺陷的,但是这丝毫不妨碍他作为一重循环的排序算法的伟大地位。

我的测试代码:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define N 30//之前写过了,就不再全写一遍了
void generate_random_number(int*, int, int);
void swap(int*, int*);void GnomeSort(int *a,int length)
{int i = 1;while (i < length){if (a[i] >= a[i - 1] || i <= 0)i++;else{swap(&a[i], &a[i - 1]);i--;}}
}int main()
{int arr[N + 10] = { 0 };generate_random_number(arr, 0, 1024);GnomeSort(arr,N);printf("排序后数列:\n");for (int i = 0; i < N; i++)printf("%d ", arr[i]);printf("\n");return 0;
}

测试结果:

至此,GnomeSort(侏儒排序)完成。

GnomeSort(侏儒排序)——C语言实现相关推荐

  1. JavaScript:实现GnomeSort侏儒排序算法(附完整源码)

    JavaScript:实现GnomeSort侏儒排序算法 export function gnomeSort (items) {if (items.length <= 1) {return}le ...

  2. PHP:GnomeSort侏儒排序(附完整源码)

    PHP:GnomeSort侏儒排序 <?phpfunction gnomeSort($array){$a = 1;$b = 2;while($a < count

  3. C语言侏儒排序Gnome sort 算法(附完整源码)

    侏儒排序Gnome sort 算法 侏儒排序Gnome sort 算法的完整源码(定义,实现,main函数测试) 侏儒排序Gnome sort 算法的完整源码(定义,实现,main函数测试) #inc ...

  4. C#:实现gnome sort 侏儒排序算法(附完整源码)

    C#:实现gnome sort 侏儒排序算法 下面是 C# 语言实现的侏儒排序算法的源代码: public static void GnomeSort(int[] arr) {int i = 1;in ...

  5. python 求和并排序_Python算法教程第三章知识点:求和式、递归式、侏儒排序法和并归排序法...

    本文目录:一.求和式:二.递归式:三.侏儒排序法和并归排序法 微信公众号:geekkr 一.求和式 # 假设有一函数为f(),则在Python中经常使用的求和方法如下. sum(f(i) for i ...

  6. Python 数据结构与算法——侏儒排序

    侏儒排序作为排序算法的历史地位远不及对其进行时间复杂度分析的地位来得高. def gnomesort(l):i = 0while i < len(l):if i == 0 or l[i-1] & ...

  7. 只有一重循环的排序——侏儒排序(Gnome Sort)

    侏儒排序:从头(i=0)开始遍历元素,如果当前元素比前一个元素大(array[i]>array[i-1]),就把它跟前一个元素互换(Swap(a[i],a[i-1]))并继续检查它(i--),否 ...

  8. Python算法教程第三章知识点:求和式、递归式、侏儒排序法和并归排序法

    本文目录:一.求和式:二.递归式:三.侏儒排序法和并归排序法 微信公众号:geekkr </br> </br> </br> 一.求和式 # 假设有一函数为f(),则 ...

  9. Go:Gnome sort 侏儒排序(附完整源码)

    Go:Gnome sort 侏儒排序 package main/** Gnome sort*/ func GnomeSort(arr []int) {i := 1tmp := 0for ; i < ...

最新文章

  1. Linux TOP 命令显示详情
  2. pandas使用query函数基于dataframe字符串数据列中字符串的长度筛选dataframe的数据行(specific column string length)
  3. PyTorch cat
  4. QML和C++混合编程--(三)
  5. MATLAB中FFT的使用方法
  6. Windows——双系统环境下没有启动Windows 启动管理器(自动跳过操作系统选择界面)解决方案
  7. ssh根据姓名查询的时候报错java.lang.IndexOutOfBoundsException: Remember that ordinal parameters are 1-based!
  8. leetcode 剑指 Offer 03. 数组中重复的数字
  9. 使用一些我喜欢的东西开始使用ES6
  10. 内核模块编程之入门(二)—必备知识
  11. vs 警告被视为错误
  12. 互惠互赢,英国将为中国大数据注入新活力
  13. Linux磁盘设备文件(sda,sdb,sdc…)变化问题
  14. 了解 JavaScript 应用程序中的内存泄漏
  15. 基于PSCAD输电线路潮流计算
  16. Windows Server 2019安装Intel I219-V I211网卡驱动
  17. 终于解决了!Windows 10打开SecoClient 提示网络扩展启动失败
  18. 无法保存此文档。它可能是只读的,或者正在被其他应用程序使用
  19. echarts实现省份迁徙图
  20. 7折怎么用计算机,美国联想八通道7折好价,海淘Thinkpad X260 笔记本电脑开箱简评(附齐购物到货过程)...

热门文章

  1. Visual Graph常见问题回答(FAQ)
  2. 清华刘知远:好的研究想法从哪里来?
  3. 如何在WPS中给一组字母上方添加一个横线
  4. dell服务器键盘接口位置,键盘与接口介绍_戴尔笔记本电脑_笔记本评测-中关村在线...
  5. 通过京东技术演进和淘宝技术演进,探察未来技术和架构
  6. php 朋友圈留言,php实例-PHP仿qq空间或朋友圈发布动态、评论动态、回复评论、删除动态或评论的功能(上)...
  7. 华为使用计算机投屏要打开什么,华为手机怎么投屏到电脑?这些小屏变大屏的操作你会吗...
  8. 使用浏览器访问服务器shell(ssh方式)
  9. 2018年(第17届)中国软件业务收入前百家企业名单
  10. python按字母顺序排列_在python中检查字符串是否按字母顺序排列