数据结构与算法之排序: 侏儒排序 (Ts, Py, Go版)

Gnome排序(地精排序) 一)算法介绍 Gnome排序(地精排序)也称侏儒排序,是一个比较简单的稳定排序算法。 描述:它和插入排序算法非常类似,都是将元素移动到合适的位置,并通过一系列交换完成的。 特点:地精排序只有一层循环,在大部分数据是有序的情况下,可以减少交换的回合数。 二)算法原理 基本原理: 第一步:先初始化一个移动指针index,默认大小为1。 第二步:判断数据是否有交换,如果数据有交换就inde... 阅读详情

排序

  • 排序:把某个乱序的数组变成升序或降序的数组 (这里用数组来做举例)

侏儒排序

  • 该排序属于 贪心 策略
  • 关注的是局部,是一种苟且的策略

Typescript 版算法实现


1 )普通版

// version 1
function gnomeSort() {
    const len: number = this.length;
    for(let i: number = 1; i < len;) {
        // 短路保护 贪心比较当前两个
        if(i < 1 || this[i-1] <= this[i]) {
            ++ i; // 正确,则递增,这里有个性能的问题,当一轮比较结束,还需要自增移动到之前已经比较好的位置,重复性太大
        } else {
            // 逆序,则交换
            [this[i-1], this[i]] = [this[i], this[i-1]]
            -- i; // i回退进行比较,直到当前所有都有序
        }
    }
}

const arr: number[] = [5,4,3,2,1];
arr.gnomeSort();
console.log(arr); // [1, 2, 3, 4, 5]

2 )优化版

// version 2 改进了不需要重复比较已经有序的元素了, 也就是说不需要自己再往回走了
function gnomeSort() {
    const len: number = this.length;
    // k是当前比较的位置, 从1 ~ len-1
    for(let k: number = 1; k < len; ++ k) {
        // 通过i进行内部比较排序, 逆序,则交换
        for(let i: number = k; i > 0 && this[i-1] > this[i]; --i) {
            [this[i-1], this[i]] = [this[i], this[i-1]]
        }
    }
}

const arr: number[] = [5,4,3,2,1];
arr.gnomeSort();
console.log(arr); // [1, 2, 3, 4, 5]
  • 侏儒排序(Gnome sort 或 Stupid sort) 其时间复杂度为:O(n^2)
  • 优点是简单明了,一眼就能看出来是干什么(顺序往前走,逆序往回走并进行交换达到当前变成顺序)
  • 每向前移动一个位置(这里记当前位置为k),就要求将当前位置的所有序排好(重点!!!)
  • 缺点是:比较苟且, 只针对眼前,当排好一次序之后,还要重新比较才能回到之前k的位置, 浪费了时间
  • 最坏的情况是输入序列完全逆序, 要将当前所有元素都比较一遍,最好的情况是已经有序了, 会一直i++下去(这不是我们研究的范围)
  • 衡量算法复杂度我们只研究最坏的情况
  • 无论成功或是失败,这个算法的目光只盯住当前相邻的两个元素,不断的一点点儿的努力,总有一天会到头的

Python3 版算法实现


1 ) 方案1

def gnome_sort_v1(arr: list) -> None:
    length = len(arr)
    i = 1
    while i < length:
        if i < 1 or arr[i - 1] <= arr[i]:
            i += 1
        else:
            arr[i - 1], arr[i] = arr[i], arr[i - 1]
            i -= 1

# 示例用法
if __name__ == "__main__":
    arr = [5, 4, 3, 2, 1]
    gnome_sort_v1(arr)
    print(arr)  # 输出: [1, 2, 3, 4, 5]

2 )方案2

def gnome_sort_v2(arr: list) -> None:
    length = len(arr)
    for k in range(1, length):
        i = k
        while i > 0 and arr[i - 1] > arr[i]:
            arr[i - 1], arr[i] = arr[i], arr[i - 1]
            i -= 1

# 示例用法
if __name__ == "__main__":
    arr = [5, 4, 3, 2, 1]
    gnome_sort_v2(arr)
    print(arr)  # 输出: [1, 2, 3, 4, 5]

Golang 版算法实现


1 ) 方案1

package main

import (
	"fmt"
)

func gnomeSort1(arr []int) {
	len := len(arr)
	for i := 1; i < len; {
		if i < 1 || arr[i-1] <= arr[i] {
			i++
		} else {
			arr[i-1], arr[i] = arr[i], arr[i-1]
			i--
		}
	}
}

func main() {
	arr := []int{5, 4, 3, 2, 1}
	gnomeSort1(arr)
	fmt.Println(arr) // 输出: [1, 2, 3, 4, 5]
}

2 )方案2

package main

import (
	"fmt"
)

func gnomeSort2(arr []int) {
	len := len(arr)
	for k := 1; k < len; k++ {
		for i := k; i > 0 && arr[i-1] > arr[i]; i-- {
			arr[i-1], arr[i] = arr[i], arr[i-1]
		}
	}
}

func main() {
	arr := []int{5, 4, 3, 2, 1}
	gnomeSort2(arr)
	fmt.Println(arr) // 输出: [1, 2, 3, 4, 5]
}
C/C++ 侏儒排序Gnome sort算法详解及源码 侏儒排序(Gnome sort)是一种简单的排序算法,它通过不断地比较相邻元素并交换位置,将元素移动到正确的位置上。2)的排序算法,如冒泡排序和选择排序,侏儒排序的性能略好一些。但是,它在处理大规模数据时效率较低,不适用于大型数据集。侏儒排序算法的优点是实现简单,代码量较少。它的时间复杂度为O(n。 阅读详情

相关推荐

如何在VSCode中无缝集成Azure OpenAI GPT-5-codex?保姆级配置教程

本文详细介绍了在VSCode中无缝集成Azure OpenAI GPT-5-codex的完整配置教程,涵盖环境准备、Azure资源创建、本地配置、VSCode插件安装及高级定制。通过Codex CLI和config.toml文件配置,开发者可快速实现AI辅助编程,大幅提升代码生成、错误诊断和文档编写效率。

weixin_29268637的博客 558

算法 - 侏儒(地精)排序(Gnome_sort)

Gnome_sort,是一个和插入排序算法类似,但是过程又和冒泡排序十分相像的算法,这个算法和插入排序相似在两者都是将元素移动到合适的位置,并通过一系列交换完成。我觉得这个算法厉害在整个算法结构只有一层循环,在大部分数据都是有序的情况下,是可以在最大限度减少交换的回合数的。..................

曾铎的博客 1300

在VM虚拟机的MobaXterm下安装JDK17

本文介绍了在Linux系统下安装配置JDK17的完整步骤:1)从Oracle或OpenJDK官网下载Linux版JDK17压缩包;2)上传至/usr/local目录;3)解压安装包;4)通过编辑/etc/profile文件配置环境变量,添加JAVA_HOME和PATH路径;5)使用source命令使配置生效;6)通过javac -version验证安装是否成功。整个过程涵盖了从下载到环境配置的完整流程,确保Java开发环境正确设置。

qq_2937655951的博客 442

GnomeSort(侏儒排序)——C语言实现

侏儒排序 GnomeSort

ctz6d1p的博客 2342

HBuilderX远程开发环境配置:Windows SSH连接实操

详细介绍如何在Windows系统中通过SSH连接远程服务器,配置HBuilderX进行高效远程开发,提升编码协作效率。全程实操演示,轻松掌握hbuilderx与远程环境的无缝对接。

weixin_35751194的博客 1195

InternVL 3.5 深度解析:开源多模态模型的新里程碑

InternVL 3.5是由上海人工智能实验室OpenGVLab团队推出的开源多模态大模型,在推理能力、效率和灵活性方面取得突破。该模型采用ViT-MLP-LLM架构,包含60亿参数的InternViT-6B视觉编码器和多种规格的语言模型骨干。核心创新包括:1)Cascade RL强化学习框架,通过离线热身和在线强化两阶段训练提升推理能力;2)ViR视觉分辨率路由器,动态调整图像处理分辨率以优化计算效率;3)DvD动态视觉token压缩技术。模型系列涵盖2B到241B参数规模,满足从边缘设备到高性能计算的不

m0_47999117的博客 1031

python 愚人排序

python愚人排序中只有一个while循环,根据比较相邻元素的大小,如果左边的元素小于右边的元素,则索引加1,进行下一对相邻元素的比较;如果左边的元素大于右边的元素,则交换两个元素的位置,并且索引减1,一次循环结束。然后在进行下一次循环的比较,直到将序列中所有的元素都进行了排序,循环结束。 侏儒排序的运行时间是 之间,分别表示最好的情况和最坏的情况。 代码如下: def gnomesort

VictorLee 555

AI Agent + 大数据 + RAG:电商用户行为分析的低成本落地

本文探讨了AIAgent与大数据技术在电商用户行为分析中的应用。通过构建"数据采集-实时分析-智能决策"的全自治链路,解决了传统大数据分析的三大痛点:人工建模周期长、实时性不足和决策闭环断裂。系统采用Flink+Spark处理实时数据,结合基于DeepSeek-V3.1的AIAgent实现智能分析,并通过飞书RAG模块动态获取业务知识。落地效果显示,分析响应时间从2-3天缩短至30秒,推荐转化率提升134%,验证了该方案在提升电商数据决策效率方面的显著价值。

想~ai抽 1625

阴间排序大全

温馨提示:本文章讲一些正经排序,如果想阅读正经排序请出门右转。

cqbzzlr的博客 379

国科大学习资料--机器学习方法与应用(叶齐祥)-期末考试题整理

国科大学习资料–机器学习方法与应用-期末考试题整理 ============================================================================================================================================================================================ =======================================

无名何许人的博客 2852

广东省道路工程检测练习试题(判断题)真题

按下式计算小于某粒径颗粒质量百分数:X=(A/B)x100( )49.、挖坑灌砂法适用于在现场测定基层(或底基层)、砂石路面及路基土的各种材料压实层的密度和压实度,但不适用于填石路堤等有大孔洞或大孔隙材料的压实度检测。95.挖坑灌砂法适用于在现场测定基层(或底基层)、砂石路面及路基土的各种材料压实层的密度和压实度,但不适用于填石路堤等有大孔洞或大孔隙材料的压实度检测( )107.以干密度 pd 为纵坐标,含水率w为横坐标,绘 pd-w 关系曲线,曲线上峰值点的纵、横坐标分别为最大干密度和最佳含水率( )

ZShy001238的博客 686

侏儒排序

var gnomeSort =function(array){ var len = array.length,i = 0;//把i想象为侏儒 while(i &lt; len){ if (i == 0 || array[i-1] &lt;= array[i]) //array[i-1]与array[i]想象为花盆 ...

weixin_34198762的博客 206

【SI好文翻译】铜箔表面纹理对损耗的影响:一个有效的模型(三)

真正的导体表面并不是完全平坦的。 有意将铜表面制造成粗糙的,以使它们在高温和压力下粘附到层压叠层中的电介质传播介质上; 剥离测试通常用于确定粘附的质量。 图 8 显示了为本研究制造的六层高轮廓层印刷电路板在四种不同的扫描电子显微镜放大倍数下的表面粗糙度。 照片中可以看到蚀刻的微带线(顶部和底部)、嵌入的玻璃纤维束、树脂阻焊层和一些杂质。

小孟同学的博客 1637

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

本文目录:一、求和式;二、递归式;三、侏儒排序法和并归排序法   一、求和式 # 假设有一函数为f(),则在Python中经常使用的求和方法如下。 sum(f(i) for i in range(m, n+1)) + sum(g(i) for i in range(m, n+1)) sum(f(i)+g(i) for i in range(m, n+1))   二、递归式 ...

花开成海 453

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

排序算法——侏儒排序(Gnome sort)【代码实现】

伪代码 function gnomeSort(a[0..size-1]) i := 1 j := 2 while i < size do if a[i-1] <= a[i] then // for descending sort, use >= for comparison i := j ...

数据联盟 2625

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

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

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

1877

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

侏儒排序算法原理与Python实现

算法原理:假设一个人沿列表从头到尾走,如果发现有相邻元素顺序不对的就交换一下,然后后退一步,否则继续往前走,当走到列表尾部时,所有元素就排好序了。import randomdef gnom...

董付国的Python专栏 200

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

侏儒排序:从头(i=0)开始遍历元素,如果当前元素比前一个元素大(array[i]>array[i-1]),就把它跟前一个元素互换(Swap(a[i],a[i-1]))并继续检查它(i--),否则检查下一个元素(i++)。当i=length时结束排序。 该排序的神奇之处是只有一重循环,而且代码简单。但是一重循环不代表时间复杂度更小,它的时间复杂度依然是O(n^2),原因就在...

weixin_34233618的博客 311

数据结构与算法笔记:字典序最大问题分析

字典序最大问题 问题描述 给定一个1到n的排列(无序状态的),依次插入到栈中,在每时每刻都可以多次从栈中弹出栈顶 问:应如何使得弹出栈顶的序列的字典序最大,并输出这个序列 问题分析 什么是字典序 比如两个序列:5,4,3,2,1和1,2,3,4,5 这两个中第一个的字典序最大 每个位置上的数字比其他序列上同一位置的数字要大 比如:第一位置中5比1大,第二位置中4比2大这样 即:字典序最大 = 从左向右看这个序列,每个数字都尽量大 题目给定一个1到n的排列,每个数字只出现一次 要使出栈的字典序最大

Wang的专栏 4393

数据结构与算法笔记:农夫过河问题python3实现

问题描述 农夫(Human)过河。一个农夫带着一只狼(Wolf),一只羊(Sheep)和一些菜(Vegetable)过河。河边只有一条船,由于船太小,只能装下农夫和他的一样东西。在无人看管的情况下,狼要吃羊,羊要吃菜,请问农夫如何才能使三样东西平安过河? 要求: 输出一行,为最终的过河方式,方案格式为 过河人员、回来人员、过河人员、回来人员、…、过河人员。 过去和回来的人员之间,用空格隔开。 以四...

Wang的专栏 3374

数据结构与算法笔记:计算思维之经典农夫过河问题C++实现

农夫、羊、狼、菜的过河问题 问题描述 角色:农夫,羊,狼,菜 条件1:船很小,只能装下农夫和其他一个角色 条件2:无人看管,羊吃菜,狼吃羊 问:如何让其他三种角色被农夫平安带着过河? 相关分析 我们可以先用人脑尝试一下相关渡河策略 1 ) 先渡狼,人回来再渡菜,人回来再渡羊 2 ) 先渡菜,人回来再渡狼,人回来再渡羊 以上两种很好想到,而且我们可以知道羊这种角色是不能先渡河过去的,羊需要最后再渡 如果先渡了羊了,之后再渡任何其他角色,都要将羊带回来 可以参考小游戏:http://gameschool

Wang的专栏 3314

数据结构与算法笔记:图搜索之DFS详解

图搜索 Graph Search 图搜索的分类 BFS广度优先(宽搜) DFS深度优先(深搜) !!!本文详解!!! 深度优先搜索DFS 深度优先遍历DFS, 这个策略其实是非常stupid or simple的,比BSF要简单的多 同样,我们可以通过一个故事来开始 在古希腊神话中, Ariadne是Crete的国王Minos的公主,她给忒修斯(Theseus)一个线团 使得忒修斯成功进入迷宫杀死牛头怪兽,但事后忒修斯抛弃了她 这是一个有道德意义的故事又或者存在不同的版本, 但不是我们的研究的对象

Wang的专栏 3119

数据结构与算法笔记:计算思维之人鬼渡河问题

人鬼渡河问题 1 ) 问题描述 目标:将东岸的3人3鬼通过一只小船安全转移到西岸,希望摆渡次数尽可能少 条件 船的容量有限,一次最多只能坐2人(或2鬼或1人1鬼) 无论是在河的东岸还是在河的西岸,一旦鬼数多于人数,则人将被鬼吃掉 怎样渡河的大权掌握在人的手中 说明:划船的时间忽略不计。船一靠岸即将船与岸视为一体,人和鬼即使还没有下 船也视为已上岸 任务:编写程序,求出一种渡河方案 备注:图片托管于github,请确保网络的可访问性 2 ) 分析 目标是找

Wang的专栏 2447

数据结构与算法之二叉树: LeetCode 701. 二叉搜索树中的插入操作 (Ts版)

1 ) 方案1:模拟。2 ) 方案2:递归。

Wang的专栏 2270
上一篇: WebGL笔记:矩阵的变换之平移的实现
下一篇: 数据结构与算法之排序: 冒泡排序 (Ts, Py, Go版)
Wang's Blog
博客等级 码龄12年 7438粉丝 2421原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wang's Blog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值