排序:直接插入排序希尔排序

目录

排序:

概念:

直接插入排序: 

代码的实现: 

代码解析: 

总结:

希尔排序: 

代码实现: 

预排序: 

代码优化: 

gap 的 本质  :

直接插入排序: 

代码图解:

总结: 

排序:

概念:

所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。

而通过排序中的元素交换次数和排序所需要的次数,排序可以分为两层:

  • 内部排序:数据元素全部放在内存中的排序。
  • 外部排序:数据元素太多不能同时放在内存中,根据排序过程的要求不能在内外存之间移动数据的排序。 

直接插入排序: 

直接插入排序是一种简单的插入排序法,其基本思想是:把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为 止,得到一个新的有序序列 。 

  • 简单来说,直接插入排序的前提是需要有一个有序的序列作为基础。

实际中我们玩扑克牌时,就用了插入排序的思想 

代码的实现: 

 代码的实现本质上也分为内外两层结构。

直接插入排序的内层是用来实现有序序列的排序,而直接插入排序的外层则是用来扩大排序的范围。

代码解析: 

如图所示,以升序为例,直接插入排序的内层进行寻找插入元素应当插入的位置和对原来排序中的元素进行移位,以此保持插入元素后仍能保持有序。

插入排序的外层是进行引入 插入的元素和扩大有序排序的范围,以此将整个数组变为 一个有序排序。

总结,通过内层将一个无序数组的一部分变成有序排序,通过外层扩大有序排序的范围最后将整个数组变成有序数组。

总结:

  1. 元素集合越接近有序,直接插入排序算法的时间效率越高
  2. 时间复杂度:O(N^2)
  3. 空间复杂度:O(1),它是一种稳定的排序算法
  4. 稳定性:稳定 

希尔排序: 

希尔排序分为预排序和直接插入排序 

  • 预排序是又称接近有序排序的排序,它是将数组内的元素进行分组,每一组内进行直接插入排序。
  • 当每一组都完成排序后,在对整个数组进行直接插入排序。

  •  如下图所示,每个三个间隙为一组进行直接插入排序。

  • 当然不止是分为这一组! 

代码实现: 

预排序: 

预排序的内部和直接排序毫无区别,只是进行将数组分为了几组,在组内进行元素的交换 

  • n-gap :如果大于了这个范围,那么可能会越界访问
  • j 表示 组数,总共有gap 组

gap不仅表示间隔几个一组也表示总共分为几组,因为如果每一个元素都和与它相隔gap个间隔的交换判断会有重复的,所以干脆分为gap组,这下将gap组全部内部直接插入排序完后在进行直接插入排序。

简单来说这是一组内的元素全部进行了比较交换后开始第二组,也就是while走完后,进入了外层的for表示开始第二组交换。

代码优化: 

如上文所诉,本次的代码可能会出现重复的交换检查,但是这并不会对代码造成任何印象,反倒是对代码起到了简化的作用。

如果上上文讲诉的代码是单独将一组出来交换后换下一组交换,而这一个代码则是一组交换完一对元素后换下一组交换一对元素 。

gap 的 本质  :
  • gap越大,大的值更快调到后面,小的值可以更快的调到前面,越不接近有序gap越小,跳得越慢,但是越接近有序。
  • 如果gap==1就是直接插入排序。
  • 如果 gap > 1 就是预排序

直接插入排序: 

因为 n 越大 gap 就必须变大,而gap 变大跳的范围越大,排序也就越不有序,所以导致了gap 这个值的不固定,但是 对于这个问题可以使用多次预排序进行解决。

  • 每次预排序结束后将gap的值缩小以此来将整个数组变得接近有序,直到 gap == 1时 完成最后的 希尔排序的 第二步——直接插入排序。

代码图解:

总结: 

希尔排序其实就是直接插入排序的升级版本,本质上是将数组中的元素分为多组进行直接排序后,在将整个数组进行直接排序。 


 

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

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

相关文章

【每日一题】最小化旅行的价格总和

文章目录 Tag题目来源题目解读解题思路方法一:深搜动态规划 写在最后 Tag 【深搜动态规划】【树】【2023-12-06】 题目来源 2646. 最小化旅行的价格总和 题目解读 有一棵无向、无根的树,树中的节点从 0 到 n-1,每个节点有一个关联的价格&a…

这款IDEA插件真的爱了

前言 Idea 是一款功能强大的集成开发环境(IDE),它可以帮助开发人员更加高效地编写、调试和部署软件应用程序,Idea 还具有许多插件和扩展,可以根据开发人员的需要进行定制和扩展,从而提高开发效率,今天我们就来介绍一款…

基于c++版本的数据结构改-python栈和队列思维总结

##栈部分-(叠猫猫) ##抽象数据类型栈的定义:是一种遵循先入后出的逻辑的线性数据结构。 换种方式去理解这种数据结构如果我们在一摞盘子中取到下面的盘子,我们首先要把最上面的盘子依次拿走,才可以继续拿下面的盘子&…

Postman可以卸载了!这款IDEA插件太好用了!

Postman是大家最常用的API调试工具,那么有没有一种方法可以不用手动写入接口到Postman,即可进行接口调试操作?今天给大家推荐一款IDEA插件:Apipost Helper,写完代码就可以调试接口并一键生成接口文档!而且还…

JIRA 禁用用户自动登录

概述 当用户登录 JIRA 时,他们可以通过在单击“Log In”按钮之前选中“Remember my login”复选框,让 JIRA 记住他们的登录信息。这样做之后,“Remember my login”令牌将由 JIRA 服务器存储,并且系统会在用户的浏览器中设置包含…

智能优化算法应用:基于学生心理学算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用:基于学生心理学算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于学生心理学算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.学生心理学算法4.实验参数设定5.算法结果…

gitLab创建新项目

1.进入git2.选择创建项目3.勾选生成readme.md文件4.邀请成员

C //例10.1 从键盘输入一些字符,逐个把它们送到磁盘上去,直到用户输入一个“#”为止。

C程序设计 (第四版) 谭浩强 例10.1 例10.1 从键盘输入一些字符,逐个把它们送到磁盘上去,直到用户输入一个“#”为止。 IDE工具:VS2010 Note: 使用不同的IDE工具可能有部分差异。 代码块 方法:使用指针&…

第一篇:MongoDB的安装、启动、关闭、链接shell

目录 简介 安装 安装遇到的问题 查看brew 当前使用的源: 更换brew 源。更换成清华大学镜像源 版本查看 MongoDB 数据目录与日志目录 启动方式一: 启动MongoDB 验证MongoDB 是否正常运行 停止或重新启动 停止MongoDB 服务 重新启动MongoDB服…

身为 Go 程序员,我为啥更喜欢用 Zig?

Zig 是一种比较新的编程语言,于 2016 年首次推出。Zig 社区将其描述为“一种用于维护稳固的、可优化和可重用软件的通用编程语言”。 看似一句简单的描述,却隐藏着远大的抱负。Zig被看作是可与C语言一较高下的编程语言。此外,Zig 也是一个编…

Python自动化测试selenium操作下拉列表实现

处理下拉列表需要使用selenium中的工具类Select,常用方法如下: 示例网站:Sahi Tests 示例场景:打开Sahi Tests页面, (1)点击“Select Test”页面,鼠标点击页面中第一个下拉列表。 …

Git版本管理配置说明 - Visual Studio

一、 Git服务端配置 在源代码管理服务器新建文件夹,并配置共享访问权限Everyone(读取/写入)。 在本地访问这台服务器共享目录,确保正确打开。 在VS中打开项目,点选Git更改,点击“创建Git仓库”,创建项目初始版本。 弹出如下对话框: 因为我们只是在局域网中开发项…

LeetCode题:931下降路径最小和

目录 一、题目要求 二、解题思路 (1)状态表示 (2)状态转移方程 (3)初始化 (4)填表顺序 (5)返回值 三、代码 一、题目要求 931. 下降路径最小和 给你…

Web测试中文件上传测试

总体情况 功能实现: (1)文件类型正确、大小合适。 (2)文件类型正确,大小不合适。 (3)文件类型错误,大小合适。 (4)文件类型和大小都合适&#xff…

路由跳转添加进度条

根据npm官网的步骤: 1.先安装nprogress npm install nprogress 2.引入nprogress和样式文件 import nprogress from nprogress import nprogress/nprogress.css 3.在前置守卫添加进度条的展示 //全局前置守卫 router.beforeEach((to: any, from: any, next: an…

Pyside2 (Qt For Python)进度条功能实现

Pyside2 (Qt For Python)进度条功能实现 进度条(QProgressBar) 今天来介绍PySide2进度条(QProgressBar)的使用,如下所示: 说明 进度条也是一个常用的控件,当程序需要做一件比较耗费时间的任…

【序列化】概念及二叉树序列化、反序列化的两种方式

序列化是什么?为什么需要序列化? 前言: (1)进程想要运行,就要向操作系统申请内存空间,进程对数据的所有操作都是在内存空间中完成的。内存中有一部分数据很重要,我们希望将这些数据存…

Slurm集群管理系统

Slurm集群管理系统 Slurm(Simple Linux Utility for Resource Management,https://slurm.schedmd.com/)是一个开源的、容错的、高度可扩展的集群管理和作业调度系统,适用于大型和小型高性能计算(HPC)集群。…

【go语言开发】go项目打包成Docker镜像,包括Dockerfile命令介绍、goctl工具生成

本文主要介绍如何将go项目打包成镜像,首先介绍Dockerfile常用命令介绍,然后介绍使用工具goctl用于生成Dockerfile,还可以根据需求自定义指令内容,最后讲解如何将go-blog项目打包成镜像,以及如何运行等 文章目录 前言Do…

提高工厂能源效率的关键:工厂能耗监测平台

工业做为能源消耗的重要场所,所以节能减排对工业来讲是一个亟需解决的问题。除了对设备进行更新换代外,还需要能源管理消耗监测平台,帮助企业实现节能减排的目标。 工厂能源消费量非常庞大,能源比较难以监测与控制。传统能源的管…