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

目录

排序:

概念:

直接插入排序: 

代码的实现: 

代码解析: 

总结:

希尔排序: 

代码实现: 

预排序: 

代码优化: 

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时 完成最后的 希尔排序的 第二步——直接插入排序。

代码图解:

总结: 

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


 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

电子版简历模板精选5篇

电子版简历模板模板下载(可在线编辑制作):做好简历,来幻主简历。 电子版简历1: 求职意向 求职类型:全职 意向岗位:ERP咨询顾问 意向城市:北京市 薪资要求:…

【微信小程序开发】学习小程序的模块化开发(自定义组件和分包加载)

前言 模块化开发是一种将复杂的应用程序分解为一系列独立的模块,每个模块负责完成特定的功能的开发方式。模块化开发可以提高代码的可维护性和可复用性,使开发过程更加高效和灵活。 文章目录 前言模块化开发的重要性和优势自定义组件自定义组件的概念和作…

每日股票价格 - 华为机试真题题解

每日股票价格 - 华为机试真题题解 题目描述 ​ 给定某只股票连续N天的价格列表stockPrices,其中stockPricesi表示股票某天的价格,请生成一个新列表,对应位置输出为:要想等到股票价格上涨,至少需要等待的天数,如果股票…

Redlock算法实现Redis分布式锁

Redlock算法实现Redis分布式锁 为什么基于故障转移的实现还不够 使用 Redis 锁定资源的最简单方法是在实例中创建密钥。密钥通常是在有限的生存时间内创建的,使用 Redis 过期功能,以便最终它被释放(我们列表中的属性 2)。当客户…

漫步者开放式耳机怎么样?南卡、漫步者开放式耳机哪个好?

现在开放式耳机的市场越来越混杂,我们作为消费者在挑选的时候,一定要找准需求点才能把踩坑几率降到最低。实在不会挑选的也不要紧,我最近入了2款目前市面最畅销的百元款开放式耳机:南卡OE CC和漫步者comfo fit,亲身上耳…

深入理解MVCC与BufferPool缓存机制

http://note.youdao.com/noteshare?idb36b975188fadf7bfbfd75c0d2d6b834&sub5A7459FE4B464EC896F9DD9A4 E MySQL在读已提交和可重复度隔离级别下都实现了MVCC机制 begin/start transaction 命令并不是一个事务的起点,在执行到它们之后的第一个修改操作InnoDB…

ubuntu windows 文件格式^M 问题

dos2unix是将Windows格式文件转换为Unix、Linux格式的实用命令。Windows格式文件的换行符为rn ,而Unix&Linux文件的换行符为n。 dos2unix命令其实就是将文件中的rn 转换为n。 而unix2dos则是和dos2unix互为孪生的一个命令,它是将Linux&Unix格式文件转换为Wi…

【Linux】telnet命令使用

telnet命令 telnet命令用于使用telnet协议与另一台主机进行通信。如果在没有主机参数的情况下调用telnet,它将进入命令模式,由其提示(telnet>)指示。在这种模式下,它接受并执行下面列出的命令。如果使用参数调用它…

二叉树的链式结构

1.二叉树的构建 想要对二叉树进行操作,我们得先构建一个二叉树 因此,这里的问题就是给定数据,如何将数据在逻辑结构上变成二叉树? 结构定义: typedef int BTDataType;typedef struct BinaryTreeNode {BTDataType v…

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

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

助力乡村振兴:VR全景技术能在乡村发展哪些方面提供帮助

引言: VR全景技术是具有巨大潜力的创新技术,它能够为乡村振兴带来许多机会。通过创建沉浸式的虚拟现实环境,VR全景技术在乡村旅游、农业、教育和文化推广等方面都能发挥重要作用。 一、乡村旅游 1.提升乡村景区宣传效果 通过使用VR全景技术…

IDEA 2023版本解决Error running Command line is too long. Shorten the command line

报错信息 Error running XXXApplication. Command line is too long. Shorten the command line via JAR manifest or via a classpath file and rerun. 解决方法 1.右键服务 选择Edit Configuration 2. 点击 Modify options 3. 勾选Shorten commnand line 4. 修改并保存

Java 实现 图片 添加 文字水印、图片水印 工具类

一、话不多说,直接上代码 1.1,水印类型枚举 import lombok.AllArgsConstructor; import lombok.Getter;/*** author: wangjing* createTime: 2023-12-05 15:01* version: 1.0.0* Description: 水印类型枚举*/ Getter AllArgsConstructor SuppressWarni…

已解决error: (-215:Assertion failed) inv_scale_x > 0 in function ‘cv::resize‘

需求背景 欲使用opencv的resize函数将图像沿着纵轴放大一倍,即原来的图像大小为(384, 512), 现在需要将图像放大为(768, 512)。 源码 import cv2 import numpy as np# 生成初始图像 img np.zeros((384, 512), dtypenp.uint8) img[172:212, 32:-32] 255 H, W …

天池SQL训练营(二)-SQL基础查询与排序

-天池龙珠计划SQL训练营 Task02:SQL基础查询与排序 SQL训练营页面地址:https://tianchi.aliyun.com/specials/promotion/aicampsql 一、SELECT语句基础 1.1 从表中选取数据 SELECT语句 从表中选取数据时需要使用SELECT语句,也就是只从表…

机器学习---线性回归算法

1、什么是回归? 从大量的函数结果和自变量反推回函数表达式的过程就是回归。线性回归是利用数理统计中回归分析来确定两种或两种以上变量间相互依赖的定量关系的一种统计分析方法。 2、一元线性回归 3、多元线性回归 如果回归分析中包括两个或两个以上的自变量&a…

基于springboot校园二手平台的开发与设计

目 录 1 绪论 1 1.1 课题研究背景 1 1.2 研究意义 1 1.3 研究的目标 2 2 系统技术选型 3 2.1 数据库选择 3 2.2 开发工具的选择 3 2.3 后端框架选择 3 2.4 前端框架选择 3 3 系统需求和可行性分析 4 3.1 总体设计原则 4 3.2 需求分析 4 3.3 可行性分析 5 3.3.1 技术可行性 5 3…

我想修改vCenter IP地址

部署vCenter Server Appliance后,您可以在vCenter修改DNS设置并选择域名服务器使用。您可以编辑vCenter Server Appliance的IP地址设置。从vSphere 6.5开始正式支持vCenter修改IP地址。因此可以更改vCenter Server Appliance的IP地址和DNS设置。 注意:更…

shein、亚马逊卖家测评如何利用自养买家号提升购买转化率?

自养买家号测评的作用,对于众多卖家来说,恐怕并不陌生。它可以快速注入评论,提升排名,创建热卖商品的一种催化剂。在当前电子商务行业蓬勃发展的背景下,买家号的重要性越来越凸显。 买家会花时间浏览店铺的评价&#…

Unity随笔1 - 安卓打包JDK not found

今天遇到一个很奇怪的事情,之前可以正常打安卓包,但是突然报错如下: 提示很明显,找不到JDK了。可是我在下载Unity的时候明明安装了所有需要的组件,为什么今天突然不行。 看了眼Unity hub里面,没问题。 那就…