插入排序和希尔排序

在这里插入图片描述
在这里插入图片描述

.

个人主页:晓风飞
专栏:数据结构|Linux|C语言
路漫漫其修远兮,吾将上下而求索


文章目录

  • 插入排序
    • 基本思想:
    • 代码实现;
  • 希尔排序
    • 基本思想:
    • 在这里插入图片描述
    • 多组并排优化
    • 《数据结构(C语言版)》--- 严蔚敏
    • 希尔排序的特性总结:
  • 时间复杂度和空间复杂度对比
  • 完整代码
  • 总结


插入排序

基本思想:

把马上要排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有记录插入完为止,得到一个新的有序序列 。就好像玩扑克牌时候,把排按顺序一个个排好,插入排序,逆序O(n^2),最好情况O(n)接近有序

在这里插入图片描述


代码实现;

gap > 1是预排序,目的是让他接近有序
gap == 1 是直接插入排序,目的是让他有序!

void InserSort(int* a, int n)//插入排序O(n^2),最好情况O(n)接近有序
{for (int i = 0; i < n - 1; i++){int end = i;int tmp = a[end + 1];//记录插入数while (end >= 0){if (tmp < a[end])//判断是否插入如果小于end位置的数,end位置开始的数往后移,不用担心覆盖,因为tmp记录了被覆盖的数{a[end + 1] = a[end];//end向后移动end--;}else{break;//大于跳出循环}}a[end + 1] = tmp;//跳出循环后在当前end位置后面插入,这时候tmp>a[end]}
}

单次排序思路:用end记录开始,tmp记录要排序的数放在end后,判断tmp是否小于前面数组end位置的数,如果小于end位置的数a[end]往后移动一位,并且end–,继续判断,直到tmp大于end,插入在end前面,直到end为0结束。


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

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

希尔排序

基本思想:

插入排序和希尔排序都属于插入类排序算法,其基本思想是通过将待排序序列分为有序和无序两部分,然后逐步将无序部分的元素插入到有序部分中,以达到整体有序的效果。

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

void ShellSort(int* a, int n)//希尔排序
{int gap = n;while (gap > 1){gap = gap / 2; //一般的取值一篇除以2//gap = gap/3+1;优化for (int j = 0; j < gap; j++)//j=0对第一组继续排序,j=1对第2组继续排序...一组一组排{for (int i = j; i < n - gap; i += gap)// 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;}else{break;}}a[end + gap] = tmp;}}}
}

在这里插入图片描述

多组并排优化

这种写法相当于多组并排,原来的写法是拍完一组排下一组,这样写就是第一组排一次,然后第二组,第3组。直到循环结束,刚好就排好了。

void ShellSort(int* a, int n)//希尔排序
{int gap = n;while (gap > 1){gap = gap / 2; //一般的取值一篇除以2//gap = gap/3+1;优化for (int i = 0; i < n - gap; ++i)//这种写法相当于多组并排{int end = i;int tmp = a[end + gap];while (end >= 0){if (tmp < a[end]){ a[end + gap] = a[end];end -= gap;}else{break;}}a[end + gap] = tmp;}}}
}

时间复杂的接近n^1.3

《数据结构(C语言版)》— 严蔚敏

希尔排序的分析是一个复杂的问题,因为它的时间是所取“增量”序列的函数,这涉及些数学上尚未解决的难题。因此,到目前为止尚未有人求得一种最好的增量序列,但大量的研究已得出一些局部的结论。如有人指出,当增量序列为dlta[k]=2←-+1-1时,希尔排序的时间复杂度为0(n3/2),其中t为排序趟数,l≤k≤t≤Llogz(n+1)」。还有人在大量的实验基础上推出:当n在某个特定范围内,希尔排序所需的比较和移动次数约为 n’·³,当 n→∞时,可减少到n(log2n)^2[2]。增量序列可以有各种取法①,但需注意:应使增量序列中的值没有除1之外的公因子,并且最后一个增量值必须等于1。

希尔排序的特性总结:

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

时间复杂度和空间复杂度对比

算法时间复杂度空间复杂度
希尔排序取决于间隔序列(数据量大的话接近n^1.3)O(1)
插入排序O(n^2)O(1)

完整代码

可以来我的github参观参观,看完整代码
路径点击这里–>所有排序练习

总结

希尔排序是插入排序的一种优化,通过引入间隔(gap)概念,对多个子序列进行排序,逐渐减小间隔直至为1。希尔排序的时间复杂度不易精确计算,但一般在O(n^1.3)左右。希尔排序的优势在于能够更快地将大的元素移动到序列的两端,从而加速整体排序的过程。希尔排序是不稳定的排序算法。两者的选择取决于具体的应用场景和数据特征。如果数据规模较小或者接近有序,插入排序可能更合适;而对于大规模数据或者需要更高效率的排序,希尔排序可能是更好的选择。

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

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

相关文章

OpenCV笔记之图像处理中遮罩和掩模的关系

OpenCV笔记之图像处理中遮罩和掩模的关系 code review 文章目录 OpenCV笔记之图像处理中遮罩和掩模的关系1.遮罩详解遮罩的创建遮罩的应用遮罩的主要应用遮罩的类型如何创建遮罩遮罩在图像处理中的应用方式 2.遮罩和掩模的关系 1.遮罩详解 在图像处理中&#xff0c;遮罩&#…

6 时间序列(不同位置的装置如何建模): GRU+Embedding

很多算法比赛经常会遇到不同的物体产生同含义的时间序列信息&#xff0c;比如不同位置的时间序列信息&#xff0c;风力发电、充电桩用电。经常会遇到该如此场景&#xff0c;对所有数据做统一处理喂给模型&#xff0c;模型很难学到区分信息&#xff0c;因此设计如果对不同位置的…

Flume1.9基础学习

文章目录 一、Flume 入门概述1、概述2、Flume 基础架构2.1 Agent2.2 Source2.3 Sink2.4 Channel2.5 Event 3、Flume 安装部署3.1 安装地址3.2 安装部署 二、Flume 入门案例1、监控端口数据官方案例1.1 概述1.2 实现步骤 2、实时监控单个追加文件2.1 概述2.2 实现步骤 3、实时监…

大模型学习笔记一:大模型应用开发基础

文章目录 一、大模型一些概念介绍 一、大模型一些概念介绍 1&#xff09;产品和大模型的区别&#xff08;产品通过调用大模型来具备的能力&#xff09; 2&#xff09;AGI定义 概念&#xff1a;一切问题可以用AI解决 3&#xff09;大模型通俗原理 根据上文&#xff0c;猜测下…

vue模拟聊天页面列表:滚动到底部,滚动到顶部触发加载更多

先看下效果&#xff1a; 代码&#xff1a; <template><div><div style"text-align: center"><button click"scrollTop">滚动到顶部</button><button click"scrollBottom">滚动到底部</button></d…

win10安装redis并配置加自启动(采用官方推荐unix子系统)

记录&#xff0c;为啥有msi安装包&#xff0c;还这么麻烦的用linux版本redis的安装方式&#xff0c;是因为从github上下载别人制作的msi报毒&#xff0c;还不止一处&#xff0c;这种链接数据库的东西&#xff0c;用别人加工过的&#xff0c;都报毒了还用就是傻逼了。 所以采用…

【计算机网络】协议,电路交换,分组交换

定义了在两个或多个通信实体之间交换的报文格式和次序,以及报文发送和/或接收一个报文或其他事件所采取的动作.网络边缘: 端系统 (因为处在因特网的边缘) 主机 端系统 客户 client服务器 server今天大部分服务器都属于大型数据中心(data center)接入网(access network) 指将端…

【webrtc】neteq测试工程

设置git代理 $ git config --global http.https://github.com.proxy socks5://127.0.0.1:7890 git config --global https.https://github.com.proxy socks5://127.0.0.1:7890导入cmake直接构建 win32 debug v143 编译opus Build started...

数据分析的理念、流程、方法、工具(上)

一、数据的价值 1、数据驱动企业运营 从电商平台的「猜你喜欢」到音乐平台的「心动模式」&#xff0c;大数据已经渗透到了我们生活的每一个场景。不论是互联网行业&#xff0c;还是零售业、制造业等&#xff0c;各行各业都在依托互联网大数据&#xff08;数据采集、数据存储、…

leetcode hot100 全排列

在本题中&#xff0c;是要求我们求一个不重复数组的全排列&#xff0c;那么全排列&#xff0c;一定是长度和数组长度一致的&#xff0c;并且&#xff0c;排列问题是有顺序的&#xff0c;即1&#xff0c;2&#xff0c;3和1&#xff0c;3&#xff0c;2是两个不同的排列。 那么&a…

预处理详解1❤

一&#xff1a;预定义符号 C语言中设置了一些预定义符号&#xff0c;它们可以直接使用&#xff0c;同时预定义符号是在预处理期间处理的。 以下就是相关的预处理符号的作用。 二&#xff1a;#define定义常量 首先基本的语法是 #define name stuff 相对比较简单&#xff…

CSDN年度报告图片卡通小人收集

摘要&#xff1a;CSDN推出的年度报告真的太赞了&#xff0c;还定制了诸如“情感的编织者”“敏锐的激励者”“灵感的捕捉者”“组织的表达者”“洞悉的指挥家”“心灵的领航员”“生动的记录者”“温暖的叙述者”“理性的探索者”等等精准且浪漫的标签&#xff0c;加上非常有灵…

【Web】CTFSHOW SQL注入刷题记录(上)

目录 无过滤注入 web171 web172 web173 web174 web175 时间盲注 写马 过滤注入 web176 web177 web178 web179 web180 web181-182 web183 web184 web185-186 web187 web188 web189 web190 布尔盲注 web191 web192 web193 web194 堆叠注入 web195 …

Stable Diffusion插件Recolor实现黑白照片上色

今天跟大家分享一个使用Recolor插件通过SD实现老旧照片轻松变彩色&#xff0c;Recolor翻译过来的含义就是重上色&#xff0c;该模型可以保持图片的构图&#xff0c;它只会负责上色&#xff0c;图片不会发生任何变化。 一&#xff1a;插件下载地址 https://github.com/pkuliyi…

OSPF协议解析及相关技术探索(C/C++代码实现)

OSPF&#xff08;开放最短路径优先&#xff09;是一种用于自治系统&#xff08;AS&#xff09;内部的路由协议&#xff0c;它是基于链路状态算法的。OSPF的设计目的是为了提供一种可扩展、快速收敛和高效的路由解决方案。 OSPF概念和特点 概念 自治系统&#xff08;AS&#…

战略合作 | IAR全面支持云途车规级MCU

IAR嵌入式开发解决方案现已全面支持云途半导体YTM32系列MCU&#xff0c;携手合作伙伴共同助力高端创新应用的开发 中国&#xff0c;上海 – 2024年1月26日 – 嵌入式开发软件和服务的全球领导者IAR与知名国产汽车芯片公司江苏云途半导体有限公司&#xff08;以下简称“云途半导…

JavaScript学习-原型和原型链

原型和原型链 示例代码 //创建一个Person类 class Person {constructor(name) {this.name name;}drink() {console.log(喝水);} } //创建一个Teacher类&#xff0c;继承Person class Teacher extends Person {constructor(name, subject) {super(name);this.subject subjec…

react 实现页面状态缓存(keep-alive)

前言&#xff1a; 因为 react、vue都是单页面应用&#xff0c;路由跳转时&#xff0c;就会销毁上一个页面的组件。但是有些项目不想被销毁&#xff0c;想保存状态。 比如&#xff1a;h5项目跳转其他页面返回时&#xff0c;页面状态不丢失。设想一个 页面我滑倒了中间&#xf…

Linux(2)——Linux中的Vim编辑器:从入门到精通

Linux中的Vim编辑器&#xff1a;从入门到精通 插播&#xff01;插播&#xff01;插播&#xff01;亲爱的朋友们&#xff0c;我们的Cmake/Makefile/Shell这三个课程上线啦&#xff01;感兴趣的小伙伴可以去下面的链接学习哦~ 构建工具大师-CSDN程序员研修院 一、Vim的基本概念…

量子网络是什么

量子网络是基于量子力学规律对量子信息进行存储、处理和传输的物理装置&#xff0c;是实现量子通讯和大规模量子计算的基础。清华大学研究团队利用同种离子的双类型量子比特编码&#xff0c;在国际上首次实现无串扰的量子网络节点&#xff0c;对未来实现量子通讯和大规模量子计…