当前位置: 首页 > news >正文

【数据结构】排序(1) ——插入排序 希尔排序

                         

目录

一. 直接插入排序

 基本思想

 代码实现

 时间和空间复杂度

 稳定性

二. 希尔排序

 基本思想

 代码实现    

 时间和空间复杂度

 稳定性



一. 直接插入排序

      基本思想

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

      图解:

     

       代码实现

      

//直接插入排序
void InsertSort(int* a, int n)
{for (int i = 0; i < n - 1 ; i++){int j = i;int tmp = a[j + 1]; //保存待排序元素while (j >= 0){if (tmp < a[j])  //将a[j+1]插入有序子表a[j + 1] = a[j];  //记录后移位置elsebreak;j--;}a[j + 1] = tmp;  //插入到正确位置}
}

 时间和空间复杂度

      时间复杂度:o(n^2)

      空间复杂度:o(1)

        平均时间复杂度也是 O(n^2),空间复杂度为常数阶 O(1),具体时间复杂度和数组的有序性也是有关联的。

        当待排序数组是有序时是最优的情况,只需当前数跟前一个数比较一下就可以了,这时一共需要比较 N-1 次,时间复杂度为 O(N)。最坏的情况是待排序数组是逆序的,此时需要比较次数最多,最坏的情况是 O(n^2)。

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

稳定性

       一种排序实施前后,关键码相同的任意两个对象其前后次序没有发生变化,就说明这个排序是稳定的,否则是不稳定的。

直接插入排序:稳定排序

二. 希尔排序

       希尔排序又称缩小增量排序,也是一种插入排序类的方法,此种方法是在直接插入排序的基础上改进的,在时间效率上有了很大的提高。

     基本思想

        以增量为步长划分子序列,即同一子序列中的逻辑上相邻元素,其下标步长等于增量。对每一个子序列进行直接插入排序。不断缩小增量,当增量为1时,所有数组元素都在一个子序列中排好序。

   图示:

          选择增量 gap = n / 2,缩小增量以 gap = gap / 2 的方式

        注意:增量序列的最后一个增量值必须为1才行

       

         

     代码实现    

         代码一: 多组并排方式

       图解

         

//希尔排序
void ShellSort(int* a, int n)
{int gap = n;  //增量初始值while (gap > 1){gap = gap / 2; //缩小增量for (int i = 0; i < n - gap; i++) //对每一组进行直接插入排序{int j = i;int tmp = a[j + gap];while (j >= 0){if (tmp < a[j]){a[j + gap] = a[j];j -= gap;}elsebreak;}a[j + gap] = tmp;}}	
}

       代码二: 一组走完,再走下一组

void ShellSort(int* a, int n)
{int gap = n / 2;  //增量初始值//gap组进行插入排序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 (tmp < a[end]){a[end + gap] = a[end];end -= gap;}elsebreak;}a[end + gap] = tmp;}}
}

说明:代码一是对代码二的改进,并没有提升效率,两种方式在效率及性能上没有本质的区别。

时间和空间复杂度

       时间复杂度: O(n^1.3)

       空间复杂度O(1)

说明:1. 希尔排序是对直接插入排序的优化。
           2. 当gap > 1时都是预排序,目的是让数组更接近于有序。当gap == 1时,数组已经接近有                 序的了,这样就会很快。这样整体而言,可以达到优化的效果。
           3. 希尔排序的时间复杂度不好计算,因为gap的取值方法很多,导致很难去计算,因此在一                些书中给出的希尔排序的时间复杂度都不固定

稳定性

  希尔排序:不稳定排序。预排序时相同的数据可能分在不同的组

    


相关文章:

【数据结构】排序(1) ——插入排序 希尔排序

目录 一. 直接插入排序 基本思想 代码实现 时间和空间复杂度 稳定性 二. 希尔排序 基本思想 代码实现 时间和空间复杂度 稳定性 一. 直接插入排序 基本思想 把待排序的记录按其关键码值的大小依次插入到一个已经排好序的有序序列中&#xff0c;直到所有的记录插入完为止&…...

Python 列表推导式深入解析

Python 列表推导式深入解析 列表推导式是 Python 中的一种简洁、易读的方式&#xff0c;用于创建列表。它基于一个现有的迭代器&#xff08;如列表、元组、集合等&#xff09;来生成新的列表。 基本语法&#xff1a; 列表推导式的基本形式如下&#xff1a; [expression for…...

信息学奥赛一本通-编程启蒙3103:练18.3 组别判断

3103&#xff1a;练18.3 组别判断 时间限制: 1000 ms 内存限制: 65536 KB 提交数: 1963 通过数: 1418 【题目描述】 信息学课上要同学分组做期末报告&#xff0c;分组的方式为依座号顺序&#xff0c;每 3个人一组。如&#xff1a;1, 2, 3 为第一组&#xff0c;4, …...

C++ primer plus--探讨 C++ 新标准

18 探讨 C 新标准 18.1 复习前面介绍过的 C11 功能 &#xff08;1&#xff09;C11 扩大了列表初始化的适用范围&#xff0c;使用初始化列表时&#xff0c;可以不加等号。 int x {5}; float y {1.1}; short arr[5] {1, 2, 3, 4, 5}; int* ar new int[4] {1, 2, 3, 4}; vect…...

2023版 STM32实战6 输出比较(PWM)包含F407/F103方式

输出比较简介和特性 -1-只有通用/高级定时器才能输出PWM -2-占空比就是高电平所占的比例 -3-输出比较就是输出不同占空比的信号 工作方式说明 -1-1- PWM工作模式 -1-2- 有效/无效电平 有效电平可以设置为高或低电平&#xff0c;是自己配置的 周期选择与计算 周期重…...

选择排序算法:简单但有效的排序方法

在计算机科学中&#xff0c;排序算法是基础且重要的主题之一。选择排序&#xff08;Selection Sort&#xff09;是其中一个简单但非常有用的排序算法。本文将详细介绍选择排序的原理和步骤&#xff0c;并提供Java语言的实现示例。 选择排序的原理 选择排序的核心思想是不断地从…...

安卓教材学习

文章目录 教材学习第一行代码 Android 第3版环境配置gradle配置下载包出现问题 教材学习 摘要&#xff1a;选了几本教材《第一行代码 Android 第3版》&#xff0c;记录一下跑案例遇到的问题&#xff0c;和总结一些内容。 第一行代码 Android 第3版 环境配置 gradle配置 gradl…...

C++设计模式-生成器(Builder)

目录 C设计模式-生成器&#xff08;Builder&#xff09; 一、意图 二、适用性 三、结构 四、参与者 五、代码 C设计模式-生成器&#xff08;Builder&#xff09; 一、意图 将一个复杂对象的构建与它的表示分离&#xff0c;使得同样的构建过程可以创建不同的表示。 二、…...

CTFHUB - SSRF

目录 SSRF漏洞 攻击对象 攻击形式 产生漏洞的函数 file_get_contents() fsockopen() curl_exec() 提高危害 利用的伪协议 file dict gopher 内网访问 伪协议读取文件 端口扫描 POST请求 总结 上传文件 总结 FastCGI协议 CGI和FastCGI的区别 FastCGI协议 …...

边缘计算网关

一、项目整体框架图 二、项目整体描述 边缘计算网关项目主要实现了智能家居场景和工业物联网场景下设备的数据采集和控制。 整个项目分为三大层&#xff1a;用户接口层、网关层、设备层。 其中用户层通过QT客户端、WEB界面及阿里云提供数据展示和用户接口。 网关使用虚拟机代替…...

1800_vim的宏录制功能尝试

全部学习信息汇总&#xff1a; GreyZhang/editors_skills: Summary for some common editor skills I used. (github.com) 最近5年多来&#xff0c;我emacs的编辑器用的还是比较多的。我的配置基本上是一个spacemacs&#xff0c;然后根据自己的需求增加了一丁点儿的其他配置。而…...

Ultra-Fast-Lane-Detection-v2 {后处理优化}//参考

采用三次多项式拟合生成的anchor特征点&#xff0c;在给定的polyfit_draw函数中&#xff0c;degree参数代表了拟合多项式的度数。 具体来说&#xff0c;当我们使用np.polyfit函数进行数据点的多项式拟合时&#xff0c;我们需要指定一个度数。这个度数决定了多项式的复杂度。例…...

【面试题精讲】Java静态方法和实例方法有何不同?

★ 有的时候博客内容会有变动&#xff0c;首发博客是最新的&#xff0c;其他博客地址可能会未同步,认准https://blog.zysicyj.top ” 首发博客地址[1] 面试题手册[2] 系列文章地址[3] Java 中的静态方法和实例方法在使用和行为上有一些不同之处。 调用方式不同&#xff1a; 静…...

【数据结构】布隆过滤器

布隆过滤器的提出 在注册账号设置昵称的时候&#xff0c;为了保证每个用户昵称的唯一性&#xff0c;系统必须检测你输入的昵称是否被使用过&#xff0c;这本质就是一个key的模型&#xff0c;我们只需要判断这个昵称被用过&#xff0c;还是没被用过。 方法一&#xff1a;用红黑…...

linux基础4---内存

1、什么是内存泄漏,怎么解决内存泄漏? 在嵌入式Linux中,内存泄漏是指由于疏忽或错误,导致一些对象或资源无法被垃圾回收器回收,从而导致内存占用不断增加,最终导致设备性能下降。内存泄漏对程序的影响很大,可能会导致应用程序变慢、崩溃或者消耗大量的内存,最终导致设…...

图论---拓扑排序

概念 一个有向图&#xff0c;如果图中有入度为 0 的点&#xff0c;就把这个点删掉&#xff0c;同时也删掉这个点所连的边。一直进行上面的处理&#xff0c;如果所有点都能被删掉&#xff0c;则这个图可以进行拓扑排序。拓扑排序是对DAG&#xff08;有向无环图&#xff09;上的节…...

java Spring Boot 将日志写入文件中记录

我们之前的一套操作来讲 日志都是在控制台上的 但 如果你的项目在正式环境上跑 运维人员突然告诉你说日志报错了&#xff0c;但你日志只在控制台上&#xff0c;那公司项目如果访问量很大 那你是很难在控制台上找到某一条日志的 这时 我们就可以用文件把它记下来 我们打开项目 …...

Android 开发错误集合

&#x1f525; 开发错误集合一 &#x1f525; Caused by: java.lang.ClassNotFoundException: Didnt find class "com.mask.app.ui.LoginRegisterActivity" on path: DexPathList[[zip file "/data/app/~~NMvHVhj8V6-HwGbh2amXDA/com.mask.app-PWbg4xIlETQ3eVY…...

VSCode个人设置习惯

账号登陆同步 点击左下角齿轮或者用户头像–>Turn on Settings Sync–>全选–>Sign in &Turn on。 可以同步配置、快捷键、插件、用户代码片段、UI状态 Windows下将powershell改为cmd 在vscode打开集成终端&#xff0c;点击右上角加号右边的下拉菜单&#xff0c…...

代码随想录训练营二刷第四十七天 | 70. 爬楼梯 (进阶) 322. 零钱兑换 279.完全平方数

代码随想录训练营二刷第四十七天 | 70. 爬楼梯 &#xff08;进阶&#xff09; 322. 零钱兑换 279.完全平方数 一、70. 爬楼梯 &#xff08;进阶&#xff09; 题目链接&#xff1a;https://leetcode.cn/problems/climbing-stairs/ 思路&#xff1a;物品是楼梯1和2&#xff0c;…...

避震不是“越硬越好”:拆解阻尼、弹簧与预载的黄金三角法则

在改装领域&#xff0c;“避震越硬操控越好”几乎成了一条默认的“铁律”。不少玩家升级绞牙避震后&#xff0c;第一反应就是将阻尼旋钮拧至紧&#xff0c;以“颠”为荣&#xff0c;仿佛不如此便无法体现硬核姿态。但Cornerspeed必须指出一个被长期忽视的工程事实&#xff1a;刚…...

如何高效解决Unity游戏插件框架BepInEx启动失败:完整指南与最佳实践

如何高效解决Unity游戏插件框架BepInEx启动失败&#xff1a;完整指南与最佳实践 【免费下载链接】BepInEx Unity / XNA game patcher and plugin framework 项目地址: https://gitcode.com/GitHub_Trending/be/BepInEx BepInEx作为Unity游戏最强大的插件框架之一&#x…...

高效Kolmogorov-Arnold网络:PyTorch实现终极指南 [特殊字符]

高效Kolmogorov-Arnold网络&#xff1a;PyTorch实现终极指南 &#x1f680; 【免费下载链接】efficient-kan An efficient pure-PyTorch implementation of Kolmogorov-Arnold Network (KAN). 项目地址: https://gitcode.com/GitHub_Trending/ef/efficient-kan Kolmogor…...

在「唯」与「阿」之间安放计算之道,老子这句话给 SAP HANA 开发的一层提醒

「唯之与阿,相去几何?美之与恶,相去若何?人之所畏,不可不畏。荒兮,其未央哉!」放在 SAP HANA 开发里看,不是把古文硬贴到技术上,而是在提醒我们,很多工程判断看起来差别很小,落到系统运行里却会拉开很大的距离。一个 JOIN 写在 application server,还是下推到 data…...

基于OpenTelemetry的LLM应用可观测性实践:从黑盒到白盒的调试革命

1. 项目概述&#xff1a;当可观测性遇上大语言模型最近在折腾大语言模型应用时&#xff0c;我遇到了一个非常典型的痛点&#xff1a;应用跑起来了&#xff0c;但内部发生了什么&#xff0c;完全是个黑盒。Prompt 到底是怎么被处理的&#xff1f;模型调用的耗时都花在哪一步了&a…...

小型嵌入式系统开发流程与实践指南

1. 小型嵌入式系统开发流程概述在嵌入式系统开发领域&#xff0c;一个结构化的软件开发流程往往是项目成功的关键因素。与通用计算机软件开发不同&#xff0c;嵌入式系统通常具有资源受限、实时性要求高、硬件依赖性强等特点&#xff0c;这使得开发流程的设计需要特别考虑这些约…...

如何用Untrunc开源工具快速修复损坏视频:完整操作指南

如何用Untrunc开源工具快速修复损坏视频&#xff1a;完整操作指南 【免费下载链接】untrunc Restore a damaged (truncated) mp4, m4v, mov, 3gp video. Provided you have a similar not broken video. 项目地址: https://gitcode.com/gh_mirrors/unt/untrunc 你是否曾…...

如何快速掌握FunClip:阿里开源AI视频剪辑的完整指南

如何快速掌握FunClip&#xff1a;阿里开源AI视频剪辑的完整指南 【免费下载链接】FunClip Open-source, accurate and easy-to-use video speech recognition & clipping tool, LLM based AI clipping intergrated. 项目地址: https://gitcode.com/GitHub_Trending/fu/Fu…...

混合量子计算:qumode与qubit协同架构解析

1. 混合量子计算基础概念解析 量子计算领域正在经历一场静默的革命——连续变量(qumode)与离散变量(qubit)的混合架构正突破传统计算范式的边界。这种混合架构不是简单的技术叠加&#xff0c;而是通过量子态的精妙耦合&#xff0c;在信息容量与计算稳定性之间建立起全新的平衡点…...

AI新闻链接汇总(2026-05-10)

AI新闻链接汇总&#xff08;2026-05-10&#xff09; 一、斯坦福大学发布《2026年人工智能指数报告》&#xff1a;美国领跑模型开发&#xff0c;中国主导机器人部署 斯坦福大学以人为本人工智能研究院于2026年4月13日正式发布《2026年人工智能指数报告》&#xff0c;这份长达4…...