Go 实现希尔排序算法及图解

news2024/9/23 21:31:13

耐心和持久胜过激烈和狂热。

哈喽大家好,我是陈明勇,今天分享的内容是使用 Go 实现希尔排序算法。如果本文对你有帮助,不妨点个赞,如果你是 Go 语言初学者,不妨点个关注,一起成长一起进步,如果本文有错误的地方,欢迎指出!

前言

前篇文章 Go 实现插入排序算法及优化
对插入排序进行了简单的介绍,然后使用 Go 实现插入排序的算法。而本文要介绍的是基于插入排序算法优化之后的高效版——希尔排序。

希尔排序

希尔排序是基于直接插入排序改进的一种高效的版本,也称“缩小增量排序”。它的基本思想是 把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至 1 时,整个文件恰被分成一组,算法便终止。

图文解释

在这里插入图片描述

  • 1、增量值 d 为 ⌊数组长度 / 2⌋ = ⌊9 / 2⌋ = 4
    • 分成三组:[6, 4, 2]、[5, 8]、[1, 9]、[7, 3]
      • [6, 4, 2] 通过直接插入排序算法进行排序,最后的结果为:[2, 4, 6]
      • [5, 8] 通过直接插入排序算法进行排序,最后的结果为:[5, 8]
      • [1,9] 通过直接插入排序算法进行排序,最后的结果为:[1, 9]
      • [7, 3] 通过直接插入排序算法进行排序,最后的结果为:[3, 7]
    • 最后的结果为 [2, 5, 1, 3, 4, 8, 9, 7, 6]

在这里插入图片描述

  • 2、增量值 d 为 ⌊d / 2⌋ = ⌊4 / 2⌋ = 2
    • 分成两组:[2, 1, 4, 9, 6]、[5, 3, 8, 7]
      • [2, 1, 4, 9, 6] 通过直接插入排序算法进行排序,最后的结果为:[1, 2, 4, 6, 9]
      • [5, 3, 8, 7] 通过直接插入排序算法进行排序,最后的结果为:[3, 5, 7, 8]
    • 最后的结果为:[1, 5, 2, 3, 4, 8, 6, 7, 9]

在这里插入图片描述

  • 3、增量值 d 为 ⌊d / 2⌋ = ⌊2 / 2⌋ = 1
    • 分成一组:[1, 5, 2, 3, 4, 8, 6, 7, 9]
      • [1, 5, 2, 3, 4, 8, 6, 7, 9] 通过直接插入排序算法进行排序,最后结果为:[1, 2, 3, 4, 5, 6, 7, 8, 9]
    • 最后的结果为:[1, 2, 3, 4, 5, 6, 7, 8, 9]

代码实现

import (
	"fmt"
)

func main() {
	nums := [9]int{6, 5, 1, 7, 4, 8, 9, 3, 2}
	fmt.Println("原数组:", nums)
	fmt.Println("--------------------------------")
	ShellSort(nums)
}

func ShellSort(nums [9]int) {
	for d := len(nums) / 2; d > 0; d /= 2 {
		for i := d; i < len(nums); i++ {
			for j := i; j >= d && nums[j-d] > nums[j]; j -= d {
				nums[j], nums[j-d] = nums[j-d], nums[j]
			}
		}
		fmt.Println(nums)
	}
	fmt.Println("--------------------------------")
	fmt.Println("排序后的数组:", nums)
}

执行结果:

原数组: [6 5 1 7 4 8 9 3 2]
--------------------------------
[2 5 1 3 4 8 9 7 6]
[1 3 2 5 4 7 6 8 9]
[1 2 3 4 5 6 7 8 9]
--------------------------------
排序后的数组: [1 2 3 4 5 6 7 8 9]
  • 第一层循环负责对增量 d 的进行修改
  • 第二层循环和第三层循环相当于对数组进行分组,然后使用直接插入排序算法对每组进行排序

小结

本文对希尔排序进行简单的介绍,然后通过图解演示希尔排序的整个排序过程,最后使用 Go 语言实现希尔排序算法。对于希尔排序里的增量,本文首次去数组长度的一般作为增量值,然后依次减半,直到等于 1;除了这种取值方式,还可以使用 Knuth序列算法去计算增量的值。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/79188.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

游戏开发51课 性能优化9

4.5 光照模型&#xff08;Lighting/Illumination Model&#xff09; 4.5.1 Flat Shading&#xff08;平面着色&#xff09; 根据表面法向量计算光照&#xff0c;并应用到整个面片上。速度最快&#xff0c;效果最差&#xff0c;容易暴露物体的多边形本质&#xff08;下图&…

微服务框架 SpringCloud微服务架构 29 ES 集群 29.4 分布式新增和查询流程

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式&#xff0c;系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 SpringCloud微服务架构 文章目录微服务框架SpringCloud微服务架构29 ES 集群29.4 分布式新增和查询流程29.4.1 ES集群的分布式存储29.4.2 总…

鸿蒙手机卸载内置应用 adb连接

鸿蒙手机傻瓜式卸载内置应用 adb连接**傻瓜式删除鸿蒙系统内置应用&#xff0c;自己亲测有效。**准备物品准备软件准备工作教程开始&#xff1a;第一步第二步完成包名列表一般软件谷歌服务格外的注意连接错误**鸣谢**傻瓜式删除鸿蒙系统内置应用&#xff0c;自己亲测有效。 准…

缓存数据丢了,原来是Redis持久化没玩明白

&#x1f4e3;&#x1f4e3;&#x1f4e3;&#x1f4e3;&#x1f4e3;&#x1f4e3;&#x1f4e3; &#x1f38d;大家好&#xff0c;我是慕枫 &#x1f38d;前阿里巴巴高级工程师&#xff0c;InfoQ签约作者、阿里云专家博主&#xff0c;一直致力于用大白话讲解技术知识 &#x…

Windows下MySQL5.5升级5.7(或直接安装MySQL5.7)

Windows下MySQL5.5升级5.7&#xff08;或直接安装MySQL5.7&#xff09; 1、关闭MySQL服务&#xff1a; Ctrl shift Esc找到服务&#xff0c;找到下面的MySQL服务&#xff0c;停止服务。 2、卸载程序&#xff1a; 控制面板中卸载mysql5.5。 3、删除mysql5.5的安装目录及注…

Linux文件操作

文章目录前言什么是文件文件操作C语言文件操作接口文件操作系统调用接口文件描述符如何理解FILE和文件描述符的关系前言 本文主要介绍的是Linux系统下的文件操作和Linux的文件系统的机制&#xff0c;希望能够通过本文来增加读者对于文件操作的基本使用和理解。以及了解Linux系…

【大数据入门核心技术-Ambari】(一)Ambari介绍

一、什么是Ambari Apache Ambari是一种基于Web的工具&#xff0c;支持Apache Hadoop集群的供应、管理和监控。Ambari已支持大多数Hadoop组件&#xff0c;包括HDFS、MapReduce、Hive、Pig、 Hbase、Zookeeper、Sqoop和Hcatalog等。 Apache Ambari 支持HDFS、MapReduce、Hive、Pi…

C语言宏和预处理

C语言宏和预处理【1】include【2】【#pragma】【3】C #include【4】# 和 ## 操作符【5】宏替换【6】#line【7】#error【8】#undef【9】源码【10】结果【1】include #include本命令包含一个文件并在当前位置插入.一般尖括号意味着在标准库目录中搜索, #include “filename” 引…

【C语言与汇编】简单学学C到汇编代码

C语言与汇编 部分过程可参考C primer plus 本书余下的篇幅讨论源代码文件中的内容&#xff1b;本节讨论创建源代码文 件的技巧。有些C实现&#xff08;如Microsoft Visual C、Embarcadero C Builder、Apple Xcode、Open Watcom C、Digital Mars C和Freescale CodeWarrior&…

精品基于SSM的民宿预订管理系统

《民宿预订管理系统》该项目含有源码、论文等资料、配套开发软件、软件安装教程、项目发布教程等 使用技术&#xff1a; 开发语言&#xff1a;Java 框架&#xff1a;ssm 技术&#xff1a;JSP JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;my…

云原生事件驱动框架(KnativeEventing)

事件驱动是指事件在持续事务管理过程中&#xff0c;进行决策的一种策略。可以通过调动可用资源执行相关任务&#xff0c;从而解决不断出现的问题。通俗地说是当用户触发使用行为时对用户行为的响应。在 Serverless 场景下&#xff0c;事件驱动完美符合其设计初衷之一&#xff1…

基于xv6的Copy-On-Write

为什么需要写时拷贝呢&#xff1f; 当 shell执行指令的时候会 fork()&#xff0c;而这个 fork()出来的进程首先会调用的就是 exec来执行对应的命令&#xff0c;如果我们将 fork()创建的进程对地址空间进行了完整的拷贝,那将是一个巨大的消耗 因为在实际应用中&#xff0c;for…

SSM项目整合

文章目录1. 导入依赖2. 配置web.xml文件3. 编写springmvc.xml配置文件4. 编写spring.xml配置文件5. 编写项目整体业务逻辑6. 开发过程中常见状态码错误1. 导入依赖 在整合SSM项目时&#xff0c;需要导入以下依赖 Spring 相关依赖 &#xff08;springmvc相关、事务相关、spring…

凤姐从国外回来会再次爆红吗?她最近的一段话发人深省

随着互联网的发展&#xff0c;也诞生了很多的网红&#xff0c;其实现如今的众多网红&#xff0c;和凤姐比起来都是小巫见大巫。凤姐原名叫罗玉凤&#xff0c;当年因为参加各种选秀节目&#xff0c;再加上鬼使神差语无伦次的言谈&#xff0c;让她一夜之间爆红了网络。 其实当我们…

Pandas统计计数value_counts()的使用

value_counts()方法返回一个序列Series&#xff0c;该序列包含每个值的数量(对于数据框中的任何列&#xff0c;value_counts()方法会返回该列每个项的计数) value_counts()是Series拥有的方法&#xff0c;一般在DataFrame中使用时&#xff0c;需要指定对哪一列进行使用 语法 …

微服务框架 SpringCloud微服务架构 29 ES 集群 29.5 故障转移

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式&#xff0c;系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 SpringCloud微服务架构 文章目录微服务框架SpringCloud微服务架构29 ES 集群29.5 故障转移29.5.1 ES集群的故障转移29.5.2 总结29 ES 集群 …

【图像分割】粒子群优化T熵图像分割【含Matlab源码 286期】

⛄一、简介 本文所采用的基于熵的切割点和最小描述长度原则(MDLP)。 A.特征选择 特征选择是一个组合优化问题&#xff0c;因为在具有N个特征的数据集上有2N个可能的不同特征子集。FS方法通常有两个重要的部分组成&#xff0c;即搜索技术和特征评估方法。 在特征评估方面&am…

Python项目之文化和旅游数据可视化

文章目录关键词一、做什么二、怎么做1.爬取数据和处理2.数据库设计&#xff0c;并将数据写入数据库3.开发后端接口4.使用Echarts官方模板三、效果展示关键词 Python后端开发Python网络爬虫Echarts可视化面向对象(见源码) 一、做什么 国家5A级旅游景区数据可视化 国家级旅游休…

状态设计模式

一、状态模式 1、定义 状态模式&#xff08;State Pattern&#xff09;又称作状态机模式&#xff08;State Machine Pattern&#xff09;&#xff0c;允许对象在内部状态发生改变时改变它的行为&#xff0c;对象看起来好像修改了它的类。属于行为型设计模式。 状态模式的核心是…

Python:面向对象

目录 一、类的定义 基本语法 python与Java关于类的封装的区别 自定义构造方法 Java与Python的区别 源码 同一个类多种构造函数的构建 源码 二、魔法方法 基础部分 比较部分 与Java的区别 容器类型 三、属性管理 四、封装 基础部分 方法拓展 五、继承&多态 继…