数据结构进阶篇 之 【插入排序】详细讲解(直接插入排序,希尔排序)

在这里插入图片描述
千万不要因为一件事不会做而失去信心,你又不是只有这一件事不会,你还有很多呢

一、插入排序

1.直接插入排序 InsertSort

1.1 基本思想

1.2 实现原理

1.3 代码实现

1.4 直接插入排序的特性总结

2.希尔排序 ShellSort

2.1 基本思想

2.2 实现原理

2.3 代码实现

2.4希尔排序的特性总结

二、完结撒❀

–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀-正文开始-❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–

一、插入排序

1.直接插入排序

1.1 基本思想

直接插入排序是一种简单的插入排序法,其基本思想是:

把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为止,得到一个新的有序序列

实际中我们玩扑克牌时,开始出牌前我们总先把牌都按照大小排列一边,这就用了插入排序的思想
在这里插入图片描述

1.2 实现原理

下面以数组实现升序为例

总体是按照·数组下标由小到大进行排序

对一个数组arr进行排序从第一个位置下标为0开始,与下标为1进行比较:

如果arr[0]>arr[1],将arr[0]后移至arr[1]的位置,再将arr[1]插入arr[0]的位置就完成了排序,再继续向后读取排序即可。
如果arr[0]<arr[1],即为升序,继续向后读取排序即可。

当插入到第i(i>=0)个元素时,前面的arr[0],arr[1]…arr[i-1]都已经排好序,此时将arr[i]对应数值与arr[i-1],arr[i-2]…对应的数值依次进行排序比较,大于arr[i]的数值依次向后移动一个数据位置大小(假设arr[i-1]大于arr[i],就将arr[i-1]后移止arr[i]的位置),arr[i]继续向前进行比较,直到遇到比arr[i]小的数时,将arr[i]插入到其前面位置即可

按照数组下标顺序,以此执行上面操作,直到将数组中最后一个数据排完为止,即可实现升序。

动态图解:
在这里插入图片描述

1.3 代码实现

//时间复杂度
//最坏情况O(N^2),逆序
//最好情况O(N)
void InsertSort(int* a, int n)
{assert(a);for (int i = 0; i < n - 1; i++){int end = i;int tmp = a[end + 1];while (end >= 0){if (a[end] > tmp){a[end + 1] = a[end];--end;}else{break;}}a[end + 1] = tmp;}
}

1.4 直接插入排序的特性总结

1. 元素集合越接近有序,直接插入排序算法的时间效率越高

2. 时间复杂度:O(N^2)

4. 空间复杂度:O(1),它是一种稳定的排序算法

5. 稳定性:稳定

2.希尔排序 ShellSort

2.1 基本思想

希尔排序法又称缩小增量法。希尔排序法的基本思想是:

先选定一个gap整数,把待排序文件中所有记录分成gap个组,所有距离为gap的整数记录分在同一组内,并对每一组内的记录进行排序。然后减小gap,重复上述分组和排序的工作。当到达gap=1时,所有记录在统一组内排好序。

在这里插入图片描述

2.2 实现原理

希尔排序相当于是对直接插入排序进行了优化
直接插入排序就相当于把gap直接当作1进行插入排序,而希尔排序不同

希尔排序分为预排序和最终排序两部进行且开始gap等于数组数据个数n,gap减小到1之前所进行的排序都为预排序,只有最后gap=1时的排序为最终排序

希尔排序之所以快是预排序在起作用,预排序的目标是让整体数组接近有序,而总体预排序消耗的时间又很少,其对最终排序的使用时间有很大增益效果

注意:这里以gap /= 2为例,进行动态图解
动态图解:
在这里插入图片描述

2.3 代码实现

注意:这里代码是以gap = gap/3+1为例,时间复杂度为O(N^1.3)。(具体说明在特性里面)

//希尔排序 时间复杂度O(N^1.3)
//欲排序 目标接近有序
void ShellSort(int* a, int n)
{assert(a);int gap = n;while (gap > 1){gap  = gap/3 + 1;for (int j = 0; j < gap; j++){for (int i = j; i < n - gap; i += gap){int end = i;int tmp = a[end + gap];while (end >= 0){if (a[end] > tmp){a[end + gap] = a[end];end -= gap;}else{break;}a[end + gap] = tmp;}}}}
}

2.4希尔排序的特性总结

1. 希尔排序是对直接插入排序的优化。

2. 当gap > 1时都是预排序,目的是让数组更接近于有序。当gap == 1时,数组已经接近有序的了,这样就会很快。这样整体而言,可以达到优化的效果。

3. 希尔排序的时间复杂度不好计算,因为gap的取值方法很多,导致很难去计算,因此在一些树中给出的希尔排序的时间复杂度都不固定:

在这里插入图片描述
《数据结构-用面相对象方法与C++描述》— 殷人昆

在这里插入图片描述

因为咱们的gap是按照Knuth提出的方式取值的,而且Knuth进行了大量的试验统计,我们暂时就按照:O(N^1.3)来算。

4.稳定性:不稳定。

二、完结撒❀

如果以上内容对你有帮助不妨点赞支持一下,以后还会分享更多编程知识,我们一起进步。
最后我想讲的是,据说点赞的都能找到漂亮女朋友❤
在这里插入图片描述

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

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

相关文章

Sora 基础作品之 DiT:Scalable Diffusion Models with Transformer

Paper name Scalable Diffusion Models with Transformers (DiT) Paper Reading Note Paper URL: https://arxiv.org/abs/2212.09748 Project URL: https://www.wpeebles.com/DiT.html Code URL: https://github.com/facebookresearch/DiT TL;DR 2022 年 UC Berkeley 出…

罗克韦尔AB的PLC协议和西门子PLC协议转换网关

下面是罗克韦尔(AB)的Compact系列的PLC与西门子S7-1500之间的通讯的配置&#xff0c;实现AB的标签数组与西门子DB数据块之间通讯。 首先在AB的PLC内建立输入和输出数组&#xff0c;用于接收和写入S7-1500的PLC数据&#xff0c;名称分别是IN_INT16、OUT_OUT16&#xff0c;输入80…

为“自研”的KV数据库编写JDBC驱动

一觉醒来&#xff0c;受到梦的启发&#xff0c;自研了一套K/V数据库系统&#xff0c;因为"客户"一直催促我提供数据库的JDBC驱动&#xff0c;无奈之下&#xff0c;只好花费一个上午的时间为用户编写一个。 我们知道&#xff0c;JDBC只定义一系列的接口, 具体的实现需…

6个黑科技网站,永久免费

1、http://mfsc123.com https://www.mfsc123.com 一个非常赞的免费商用素材导航网站。 收集了各种免费、免版权的图片、插画、视频、视频模板、音乐、音效、字体、图标网站。 再也不用担心版权问题&#xff0c;都能免费商用&#xff0c;自媒体作者必备。 而且还在每个网站…

WeekPaper:GraphTranslator将知识图谱与大模型对齐

GraphTranslator: 将图模型与大型语言模型对齐&#xff0c;用于开放式任务。 将基于图的结构和信息与大型语言模型的能力整合在一起&#xff0c;以提高在涉及复杂和多样数据的任务中的性能。其目标是利用图模型和大型语言模型的优势&#xff0c;解决需要处理和理解结构化和非结…

Python深度学习034:cuda的环境如何配置

文章目录 1.安装nvidia cuda驱动CMD中看一下cuda版本:下载并安装cuda驱动2.创建虚拟环境并安装pytorch的torch_cuda3.测试附录1.安装nvidia cuda驱动 CMD中看一下cuda版本: 注意: 红框的cuda版本,是你的显卡能装的最高的cuda版本,所以可以选择低于它的版本。比如我的是11…

Prometheus+grafana环境搭建redis(docker+二进制两种方式安装)(四)

由于所有组件写一篇幅过长&#xff0c;所以每个组件分一篇方便查看&#xff0c;前三篇 Prometheusgrafana环境搭建方法及流程两种方式(docker和源码包)(一)-CSDN博客 Prometheusgrafana环境搭建rabbitmq(docker二进制两种方式安装)(二)-CSDN博客 Prometheusgrafana环境搭建m…

HarmonyOS实战开发-一次开发,多端部署-视频应用

介绍 随着智能设备类型的不断丰富&#xff0c;用户可以在不同的设备上享受同样的服务&#xff0c;但由于设备形态不尽相同&#xff0c;开发者往往需要针对具体设备修改或重构代码&#xff0c;以实现功能完整性和界面美观性的统一。OpenHarmony为开发者提供了“一次开发&#x…

Ubuntu20.04安装MatlabR2018a

一、安装包 安装包下载链接 提取码&#xff1a;kve2 网上相关教程很多&#xff0c;此处仅作为安装软件记录&#xff0c;方便后续软件重装&#xff0c;大家按需取用。 二、安装 1. 相关文件一览 下载并解压文件后&#xff0c;如下图所示&#xff1a; 2. 挂载镜像并安装 2…

python实战之宝塔部署flask项目

一. 项目 这个demo只是提供了简单的几个api接口, 并没有前端页面 # -*- coding: utf-8 -*- import flask as fk from flask import jsonify, requestapp fk.Flask(__name__)app.route(/api/hello, methods[GET]) def get_data():return hello world# 假设我们要提供一个获取用…

rabbitmq死信交换机,死信队列使用

背景 对于核心业务需要保证消息必须正常消费&#xff0c;就必须考虑消费失败的场景&#xff0c;rabbitmq提供了以下三种消费失败处理机制 直接reject&#xff0c;丢弃消息&#xff08;默认&#xff09;返回nack&#xff0c;消息重新入队列将失败消息投递到指定的交换机 对于核…

vi/vim编辑器

一:vi/vim编辑器介绍 vi\vim 是visual interface简称&#xff0c;是Linux中最经典的文本编辑器 vim是vi的加强版&#xff0c;兼容vi的所有命令&#xff0c;而且还具有shell编程能力 二vi/vim编译器的三种工作模式 一:命令模式 二输入模式:编程模式&#xff0c;此模式下可对…

【电路笔记】-逻辑与门

逻辑与门 文章目录 逻辑与门1、概述2、2 输入晶体管与门3、数字与门类型4、7408 四路 2 输入与门逻辑与门是一种数字逻辑电路,仅当其所有输入均为高电平时,其输出才会变为高电平至逻辑电平 1。 1、概述 数字逻辑与门的输出状态仅在其任何输入处于逻辑电平“0”时再次返回“低…

每日一题 --- 右旋字符串[卡码][Go]

右旋字符串 题目&#xff1a;55. 右旋字符串&#xff08;第八期模拟笔试&#xff09; (kamacoder.com) 题目描述 字符串的右旋转操作是把字符串尾部的若干个字符转移到字符串的前面。给定一个字符串 s 和一个正整数 k&#xff0c;请编写一个函数&#xff0c;将字符串中的后面…

HarmonyOS 应用开发之同步任务开发指导 (TaskPool和Worker)

同步任务是指在多个线程之间协调执行的任务&#xff0c;其目的是确保多个任务按照一定的顺序和规则执行&#xff0c;例如使用锁来防止数据竞争。 同步任务的实现需要考虑多个线程之间的协作和同步&#xff0c;以确保数据的正确性和程序的正确执行。 由于TaskPool偏向于单个独…

scRNA+bulk+MR:动脉粥样硬化五个GEO数据集+GWAS,工作量十分到位

今天给大家分享一篇JCR一区&#xff0c;单细胞bulkMR的文章&#xff1a;An integrative analysis of single-cell and bulk transcriptome and bidirectional mendelian randomization analysis identified C1Q as a novel stimulated risk gene for Atherosclerosis 标题&…

MySQL 索引优化(一)

索引创建原则 先写代码&#xff0c;再建索引 不应该在创建完表之后立马就创建索引&#xff0c;等主体业务开发完毕以后&#xff0c;再把涉及到该表的 sql 分析过后再建立索引。联合索引尽量覆盖查询条件 在设计一个联合索引的时候&#xff0c;让联合索引尽可能的包含 sql 语句…

rtph264depay插件分析笔记

1、rtp协议头 2、rtp可以基于TCP或者UDP 其中基于TCP需要加4个字节的RTP标志 3、rtph264depay定义解析函数gst_rtp_h264_depay_process&#xff0c;通过RFC 3984文档实现。 static void gst_rtp_h264_depay_class_init (GstRtpH264DepayClass * klass) {GObjectClass *gobject…

AI资讯2024-04-02 | 前微软副总裁姜大昕携「阶跃星辰」入场,出手即万亿参数大模型!

关注文章底部公众号获取每日AI新闻,以及各种好玩的黑科技,如AI换脸,AI数字人,AI生成视频等工具 阶跃星辰发布万亿参数大模型 终于!国内大模型创业公司最后一位强实力玩家入场——阶跃星辰。它是由微软前全球副总裁姜大昕所创办,公司名称也来源于,发了三个大模型:Step-…

当msvcp120.dll文件找不到了要怎么解决?教你靠谱的3种修复msvcp120.dll方法

当出现msvcp120.dll文件丢失的问题时&#xff0c;不用担心&#xff0c;这是一个常见的情况。在日常使用电脑时&#xff0c;误删或受到计算机病毒影响都可能导致这个问题。为了解决这个问题&#xff0c;今天我们将向大家介绍正确的msvcp120.dll修复方法。 一.msvcp120.dll文件是…