排序算法专题_1_GnomeSort (侏儒排序)——最简单的排序

news/2024/11/24 2:21:04/

最简单的排序算法不是冒泡排序…,不是插入排序…,而是Gnome排序!
The simplest sort algorithm is not Bubble Sort…, it is not Insertion Sort…, it’s Gnome Sort!

Gnome Sort is based on the technique used by the standard Dutch Garden Gnome (Du.: tuinkabouter). Here is how a garden gnome sorts a line of flower pots. Basically, he looks at the flower pot next to him and the previous one; if they are in the right order he steps one pot forward, otherwise he swaps them and steps one pot backwards. Boundary conditions: if there is no previous pot, he steps forwards; if there is no pot next to him, he is done.

—Dick Grune

侏儒分类是基于标准荷兰花园侏儒(Du.:tuinkabouter)所使用的技术。以下是一个花园侏儒如何对一排花盆进行分类。基本上,他看旁边的花盆和前面的花盆;如果它们的顺序正确,他向前踩一个罐子,否则他交换它们,向后踩一个锅。边界条件:如果之前没有锅,他就向前走;如果他旁边没有锅,他就完了。

注意:侏儒排序是稳定排序算法
以下是最原始的侏儒排序的实现代码

C

void Gnome_Sort(int a[],int n){int i=0;while(i<n){if(i<0||a[i]<=a[i+1])i++;else {int t=a[i];a[i]=a[i+1];a[i+1]=t;i--;}}
}

C++

void Gnome_Sort(int a[],int n){int i=0;while(i<n){if(i<0||a[i]<=a[i+1])i++;else {swap(a[i],a[i+1]);i--;}}
}

The gnome sort may be optimized by introducing a variable to store the position before traversing back toward the beginning of the list. This would allow the “gnome” to teleport back to his previous position after moving a flower pot. With this optimization, the gnome sort would become a variant of the insertion sort.
—Dick Grune

gnome排序可以通过在返回列表的开头之前引入一个变量来存储位置来进行优化。这将允许“侏儒”在移动花盆后传送回他之前的位置。通过这种优化,gnome排序将成为插入排序的变体

这样就出现了GnomeSort的优化

void Gnome_Sort2(int a[],int n){int i=0;int last_i=-1;while(i<n){if(i<0||a[i]<=a[i+1]) {if(last_i==-1)i++;else i=last_i-1,last_i--;}else {if(last_i==-1)last_i=i;int t=a[i];a[i]=a[i+1];a[i+1]=t;i--;}}
}

如果再次优化,我们将可以得到插入排序的单循环版本(to be continue)

侏儒排序具体步骤流程图

题外话:
这里放一个可以用来测试排序的两个函数

随机数组函数:

//#include <time.h>
//#include <stdlib.h> //头文件
void rand_array(int a[],int n){time_t t;srand((unsigned )time(&t));for(int i=0;i<n;i++){a[i]=rand()%100;}
}

测试函数

_Bool check(int a[],int n){for(int i=0;i<n-1;i++)if(a[i]>a[i+1])return 0;else return 1;
}

打印函数

void Print(int a[],int n){for(int i=0;i<n;i++)printf("%d ",a[i]);puts("");
}

http://www.ppmy.cn/news/102558.html

相关文章

华为OD机试真题 Java 实现【递增字符串】【2023Q1 200分】,附详细解题思路

一、题目描述 定义字符串完全由“A’和B"组成&#xff0c;当然也可以全是"A"或全是"B。如果字符串从前往后都是以字典序排列的&#xff0c;那么我们称之为严格递增字符串。 给出一个字符串5&#xff0c;允许修改字符串中的任意字符&#xff0c;即可以将任…

某SRC的渗透测试实战

前言 因为不甘心被称作会只点鼠标的猴子&#xff0c;所以开始了一次某SRC漏洞挖掘&#xff0c;为期一个多星期。文章有点长&#xff0c;但请耐心看完&#xff0c;记录了完整的SRC漏洞挖掘实战 渗透过程 因为选择的幸运儿没有对测试范围进行规划&#xff0c;所以此次范围就是…

斑梨电子Air101开发板LuatOS XT804内核QFN32支持128x160分辨率

spotpear.cn/index/product/detail/id/1332.html detail.tmall.com/item.htm?id719888144249 【产品简介】 [] Air101开发板使用Air101处理器&#xff0c;内置2MFlash和176KLuatOS专属RAM&#xff0c;最高主频可以达到240MHz,采用QFN32封装&#xff0c;18组GPIO可用。开发板…

Linux压缩和归档命令的速查表

在Linux系统中&#xff0c;有多种命令可用于压缩和归档文件和目录。这些命令使我们能够将文件和目录打包成单个文件&#xff0c;并可以选择压缩以节省存储空间。本文将提供一个Linux压缩和归档命令的速查表&#xff0c;帮助您快速查找和了解各种常用命令及其用法。 压缩文件和目…

如何在 Linux 中进行网络地址转换 (NAT)?

网络地址转换&#xff08;Network Address Translation&#xff0c;简称NAT&#xff09;是一种在网络中使用的技术&#xff0c;它允许将私有网络中的IP地址映射到公共网络上&#xff0c;从而实现多个设备共享单个公共IP地址。在Linux系统中&#xff0c;我们可以使用一些工具和配…

实验篇(7.2) 04. 映射服务器到公网IP 远程访问 ❀ Fortinet网络安全专家 NSE4

【简介】由于服务器的IP是内网地址&#xff0c;所以无法从公网直接访问服务器。要想远程访问服务器&#xff0c;最简单的办法就是将服务器映射到公网IP&#xff0c;然后通过公网IP加端口号的方式进行访问。 实验要求与环境 OldMei集团深圳总部部署了一台服务器&#xff0c;用来…

ctfshow 每周大挑战 RCE极限挑战3

目录 题目源码1 跑一下正则2 分析解题用什么payload3 构造payload如何获取字母N构造出_POST及其他拼接内容POST传参 4 完整解题payload 题目源码 1 跑一下正则 <?php for($i32;$i<127;$i){if (!preg_match("/[a-zA-Z2-9!#%^&*:{}\-<\?>\"|~\\\\]/…

OceanMind海睿思入选《2023中国企业数智化转型全景图中国数据智能产业图谱》

近日&#xff0c;国内知名大数据产业创新服务媒体数据猿携手上海大数据联盟发布了《2023中国企业数智化转型升级服务全景图/产业图谱》和《2023中国数据智能产业图谱》。 两份图谱系统梳理了中国数智化转型升级及数据智能行业发展现状和脉络&#xff0c;评选出极具商业合作价值…