【排序算法】插入排序与希尔排序,你不想知道为什么希尔比插入更快吗?

文章目录
- 🚀前言
- 🚀插入排序(insertsort)
- ✈️原理
- ✈️代码实现(coding)
- 🚀总结
- 🚀希尔排序(shellsort)
- ✈️代码实现(coding)
- ✈️为啥希尔排序能比插入排序更快
🚀前言
大家好啊!本文阿辉讲介绍插入排序和希尔排序,并将解释为什么希尔排序比插入排序更快。
🚀插入排序(insertsort)
✈️原理
插入排序,实际上是我们平时都使用过的排序,为什么这么说呢😆?想必大家都玩过扑克牌吧,大家是如何整理手中的牌的呢?一定是想下面这样对吧👇

没错,插入排序也是的么实现的
其实关于插入排序,一句话足以概括:对于要排序的数据,从前往后遍历所有数据,遍历到的数据与之前的数据进行比较,以升序为例,若遍历位置的数据比前一个数据小两者就交换,然后接着与前一个位置比较如果还小就继续交换,直到比前一个数据大就停止交换
给铁子们上动图😘

✈️代码实现(coding)
对于插入排序,我们需要两个循环来控制,一个循环来遍历所有数据,另 一个循环用来遍历已排好序的部分与要插入数据比较
coding
void insertsort(int arr[],int sz){int insert = 0;//遍历要插入的位置for(insert = 1;insert < sz;insert++){int cur = insert;//记录待排序的位置int pre = cur - 1;//记录待排序的前一个位置while(cur < pre && cur > 0){//没前一个位置大就交换,待排序位置来到0位置就退出循环int tmp = arr[cur];arr[cur] = arr[pre];arr[pre] = tmp;--cur,--pre;//待排序位置和前一个位置同时--}}
}
🚀总结
稳定性的定义
说到稳定性,与之对应就是不稳定性,那么排序算法的稳定性又为何意呢?通俗地讲就是,能保证排序前两个相等的数其在序列的前后位置顺序与排序后它们的前后位置顺序一致。形式化解释如下:一列数中,如果Ai = Aj,Ai位于Aj的前置位,那么经过升降序排序后Ai仍然位于Aj的前置位
阿辉之前介绍的 冒泡和选择排序和今天的插入排序,到现在排序中三个最挫的排序已经介绍完了,这三个的时间复杂度都是O(n2),选择排序是最挫的,冒泡和插入排序都可以做到有稳定性而选择排序做不到
为什么选择排序不行,一个简单的例子就能解释
比如一串数字 83482,一趟选择下来,第一个8与2交换,这样第一个8和第二个8之间的稳定性就被打破了
🚀希尔排序(shellsort)
希尔排序(Shell Sort)是一种基于插入排序的排序算法,也被称为“缩小增量排序”(Diminishing Increment Sort)。它通过将整个列表分割成多个较小的子序列,并对这些子序列进行插入排序,从而逐步减少排序的范围,最终完成整个列表的排序。希尔排序在提供了一种平衡了性能和简单性的排序方法。
好吧上面百度粘的说得不是人话
其实希尔排序就是将数据分组,在每个组内进行插入排序(对就是直接进行插入排序),那么如何分组呢?设置一个增量序列,开始的增量通常是数组长度的一半,然后下一次增量减半,增量设为gap,给铁子们上图

✈️代码实现(coding)
void shellsort(int arr[],int sz){for(int gap = sz/2;gap > 0;gap /= 2){for(int i = gap;i < n;++i){//i从每组的第二个数遍历,因为每组的第一个数不用进行插入排序int k = arr[i];//记录当前进行插入排序的数据for(int j = i;j >= gap && k < arr[j - gap];j -= gap)//如果待插入的数据比前一个数据小就将前一个数移到待排序的位置,接着与下一个位置比较arr[j] = arr[j-gap];arr[j] = k;//最后将要插入的数据插到合适的位置}}
}
希尔排序没有稳定性,是阿辉介绍的第一个时间复杂度突破O(n2)的排序,时间复杂度在O(nlogn)~O(n2)之间,有同学可能会问为啥仅仅分了各组就让希尔排序更快了,问的好重点来了
✈️为啥希尔排序能比插入排序更快
其实一个列子就能让你明白,比如下列这个数组:

对于最后的1插入排序需要交换5次才能来到正确的位置
而如果使用希尔排序,对于第一个增量3,1将与8一组,一次交换就让1跨过了3和4下标的位置,从而少了2次交换,所以希尔排序比插入排序更快,它降低了交换的次数
其实,阿辉介绍的这些比较挫的排序,之所以挫就是因为它们大量浪费了交换,后续阿辉介绍的时间复杂度在O(nlogn)的排序都减少了交换的次数

相关文章:
【排序算法】插入排序与希尔排序,你不想知道为什么希尔比插入更快吗?
文章目录 🚀前言🚀插入排序(insertsort)✈️原理✈️代码实现(coding) 🚀总结🚀希尔排序(shellsort)✈️代码实现(coding)✈️为啥希尔…...
Unity中向量的点乘、叉乘区别和作用以及经典案例
文章目录 点乘(Dot Product)叉乘(Cross Product)向量归一化(Normalize)其他作用 unity开发中我们要计算角度,判断位置,常用点乘、叉乘、归一化等等,我们看看他们的使用案…...
(26)Linux 进程通信之共享内存(共享储存空间)
共享内存是System V版本的最后一个进程间通信方式。共享内存,顾名思义就是允许两个不相关的进程访问同一个逻辑内存,共享内存是两个正在运行的进程之间共享和传递数据的一种非常有效的方式。不同进程之间共享的内存通常为同一段物理内存。进程可以将同一…...
体感游戏开发体感互动游戏
体感健身游戏是一种利用特定技术来跟踪和响应玩家身体动作的互动式电子游戏。这种游戏类型的目的是通过有趣、动态的方式鼓励用户进行身体活动和健康锻炼。下面是有关体感健身游戏的一些重要信息: 体感游戏技术背景 体感技术:这些游戏通常使用运动传感…...
vulnhub靶场之DC-5
一.环境搭建 1.靶场描述 DC-5 is another purposely built vulnerable lab with the intent of gaining experience in the world of penetration testing. The plan was for DC-5 to kick it up a notch, so this might not be great for beginners, but should be ok for p…...
为什么选择CRM系统时,在线演示很重要?
想要知道一款CRM管理系统是否满足企业的需求,操作是否简单,运行是否流畅,最直观的方式就是远程演示。否则,光凭厂商的销售人员介绍一下产品,企业就盲目下单,最后发现功能不匹配,还要赔钱赔时间重…...
专业实习day3、4(路由器做内网访问公网)
专业实习 代码 display ip interface brief 显示当前设备下所有接口IP undo IP地址支持覆盖,但是正常的命令不能覆盖必须undo(删除)掉 un in en 在做配置的过程中,设备系统一般都会出现一些提示或者告警之类的东西,从…...
H264码流进行RTP包封装
一.H264基本概念 H.264从框架结构上分为视频编码层(VCL)和网络抽象层(NAL),VCL功能是进行视频编解码,包括运动补偿预测,变换编码和熵编码等功能;NAL用于采用适当的格式对VCL视频数据…...
基于多智能体点对点转换的分布式模型预测控制
matlab2020正常运行 基于多智能体点对点转换的分布式模型预测控制资源-CSDN文库...
性能分析与调优: Linux 实现 缺页剖析与火焰图
目录 一、实验 1.环境 2.缺页(RSS增长)剖析与火焰图 一、实验 1.环境 (1)主机 表1-1 主机 主机架构组件IP备注prometheus 监测 系统 prometheus、node_exporter 192.168.204.18grafana监测GUIgrafana192.168.204.19agent 监测 主机 node_exporter…...
代码随想录算法训练营第17天 | 110.平衡二叉树 + 257. 二叉树的所有路径 + 404.左叶子之和
今日内容 110.平衡二叉树 257. 二叉树的所有路径 404.左叶子之和 110.平衡二叉树 - Easy 题目链接:. - 力扣(LeetCode) 给定一个二叉树,判断它是否是高度平衡的二叉树。 本题中,一棵高度平衡二叉树定义为࿱…...
ubuntu20.04网络问题以及解决方案
1.网络图标消失,wired消失,ens33消失 参考:https://blog.51cto.com/u_204222/2465609 https://blog.csdn.net/qq_42265170/article/details/123640669 原始是在虚拟机中切换网络连接方式(桥接和NAT), 解决…...
Java面试题(java高级面试题)
线程池的核心线程数设置为多大比较合理? Worker线程在执行的过程中,有一部计算时间需要占用CPU,另一部分等待时间不需要占用CPU,通过量化分析,例如打日志进行统计,可以统计出整个Worker线程执行过程中这两…...
【MIdjourney】关于图像中人物视角的关键词
本篇仅是我个人在使用过程中的一些经验之谈,不代表一定是对的,如有任何问题欢迎在评论区指正,如有补充也欢迎在评论区留言。 1.全景镜头(panorama) 全景镜头是一种广角镜头,可以捕捉到比普通镜头更广阔的视野范围。全景镜头&…...
433. 最小基因变化(Queue使用ArrayList和LinkedList进行声明)
这道题可以看成一个24叉树。 因为基因序列长度固定为8,且每个位置的字母固定是AGCT,可以选择改变的只有3个字母,所以一次最多24种情况。 然后检查变化后的结果是否存在bank中(使用hashSet来存储),同时设置…...
MYSQL双主节点–更换ip
MYSQL双主节点–更换ip 一、更换双主节点ip 1.停止mysql服务 #安装了supervisor supervisorctl stop mysql #未安装 systemctl stop mysqld2.修改网卡配置信息 注:ens33是网卡名称,可能网卡不叫ens33 vi /etc/sysconfig/network-scripts/ifcfg-ens333…...
一文玩转Go语言中的面向对象编程~
温故而知新:什么是面向对象 面向对象(Object-Oriented)是一种计算机编程的方法和思想,它将程序中的数据(对象)和操作(方法)组织成一个个相互关联和交互的对象。对象是现实世界中的事…...
kylin集群反向代理(健康检查)
前面一篇文章提到了使用nginx来对kylin集群进行反向代理, kylin集群使用nginx反向代理-CSDN博客文章浏览阅读349次,点赞8次,收藏9次。由于是同一个集群的,元数据没有变化,所以,直接将原本的kylin使用scp的…...
【docker】centos7安装harbor
目录 零、前提一、下载离线包二、安装三、访问四、开机自启 零、前提 1.前提是已经安装了docker和docker-compose 一、下载离线包 1. csdn资源:harbor-offline-installer-v2.10.0.tgz 2. 百度云盘(提取码:ap3t):harbo…...
2024 年 1 月安全更新修补了 58 个漏洞(Android )
谷歌发布了针对 Android 平台 58 个漏洞的补丁,并修复了 Pixel 设备中的 3 个安全漏洞,拉开了 2024 年的序幕。 Android 2024 年 1 月更新的第一部分以 2024 年 1 月 1 日安全补丁级别发布在设备上,解决了框架和系统组件中的 10 个安全漏洞&…...
【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15
缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下: struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...
stm32G473的flash模式是单bank还是双bank?
今天突然有人stm32G473的flash模式是单bank还是双bank?由于时间太久,我真忘记了。搜搜发现,还真有人和我一样。见下面的链接:https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...
Admin.Net中的消息通信SignalR解释
定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...
Python爬虫(一):爬虫伪装
一、网站防爬机制概述 在当今互联网环境中,具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类: 身份验证机制:直接将未经授权的爬虫阻挡在外反爬技术体系:通过各种技术手段增加爬虫获取数据的难度…...
12.找到字符串中所有字母异位词
🧠 题目解析 题目描述: 给定两个字符串 s 和 p,找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义: 若两个字符串包含的字符种类和出现次数完全相同,顺序无所谓,则互为…...
C++八股 —— 单例模式
文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全(Thread Safety) 线程安全是指在多线程环境下,某个函数、类或代码片段能够被多个线程同时调用时,仍能保证数据的一致性和逻辑的正确性…...
C++:多态机制详解
目录 一. 多态的概念 1.静态多态(编译时多态) 二.动态多态的定义及实现 1.多态的构成条件 2.虚函数 3.虚函数的重写/覆盖 4.虚函数重写的一些其他问题 1).协变 2).析构函数的重写 5.override 和 final关键字 1&#…...
手机平板能效生态设计指令EU 2023/1670标准解读
手机平板能效生态设计指令EU 2023/1670标准解读 以下是针对欧盟《手机和平板电脑生态设计法规》(EU) 2023/1670 的核心解读,综合法规核心要求、最新修正及企业合规要点: 一、法规背景与目标 生效与强制时间 发布于2023年8月31日(OJ公报&…...
Ubuntu系统复制(U盘-电脑硬盘)
所需环境 电脑自带硬盘:1块 (1T) U盘1:Ubuntu系统引导盘(用于“U盘2”复制到“电脑自带硬盘”) U盘2:Ubuntu系统盘(1T,用于被复制) !!!建议“电脑…...
Unity中的transform.up
2025年6月8日,周日下午 在Unity中,transform.up是Transform组件的一个属性,表示游戏对象在世界空间中的“上”方向(Y轴正方向),且会随对象旋转动态变化。以下是关键点解析: 基本定义 transfor…...
