11 插入排序和希尔排序

1. 插入排序

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

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

在玩扑克牌时,就用了插入排序的思想

在这里插入图片描述

过程
在这里插入图片描述

类似扑克牌,手里有3,7,8,9,,四张牌,这时,如果摸到4,怎么排它的位置。先和9比,小于9,再和前面的8比,再和7比,再和3比,这时大于3,就找到了它该插入的位置,将4放在3的后面,其他的往后挪一个

在这里插入图片描述

从7开始排,第一个数肯定是有序的。
然后是4,4小于7,所以7应该在4的前面,将7往后挪一位,4放在7的位置
5比7小,7往后挪,5比4大,所以5的位置就是4的后面

这样不断比较,直到最后一个数排完

void Sort(int ary[], int len)
{//第一个是有序的,从第二个开始for (int i = 1; i < len; i++){//[0,end]的区间是有序的,end是待排序数的前一个下标int end = i - 1;int temp = ary[i];while (end >= 0){if (ary[end] > temp){ary[end + 1] = ary[end];end--;}else{break;}}//此时,end是前一个位置ary[end + 1] = temp;}}

特性总结:
1.元素集合越接近有序,直接插入排序算法的时间效率越高
2.时间复杂度:最坏O(N2),逆序的时候最坏,最好是O(N),正序的时候
3.空间复杂度: O(1)
4.稳定性:稳定

插入和冒泡
两者在最好和最坏的情况下时间复杂度相同,但对于大部分有序,局部无序的情况下,插入的适应性更强
在这里插入图片描述

上面的数据只有最后面的9和8无序,对于冒泡排序来说,需要第一轮比过去,交换8和9,第二轮到9的位置后发现有序,排序完毕。插入排序来说,检查到8的时候,一交换,排序完毕。这时,插入排序的效率高。冒泡排序更容易理解,比较容易上手

2. 希尔排序

基本思想
希尔排序又称缩小增量法,基本思想是:先选定一个整数,把待排序文件中所有记录分成几个组,对每一组内的记录进行排序。然后缩小分组间隔。重复上述过程,当增量缩小到1时,所有记录排为一组,排好序

插入排序对大部分有序的数据效率很高,但对于倒序的效率很低。可以根据这个特性优化。先对数据用一种效率高的方法进行预排序,使数据接近有序。最后再进行一次插入排序,就可以排序成功

过程
在这里插入图片描述
首先将整个数组按间隔gap分组,分为gap组,这里以间隔3分组

在这里插入图片描述

上面的从9开始每间隔3分为归为一组,9,6,3,1分到了一组

然后从8开始分组,直到将所有数据分组完
在这里插入图片描述
以颜色区分分为了3组,首先写一个类似的插入排序对红色组排序

void ShellSort(int ary[], int len)
{
//间隔3int gap = 3;
//0,从end+gap开始往前对比,到组内最后一个数排完,每次加间距for (int i = 0; i < len - gap; i += gap){int end = i;int temp = ary[gap + end];
//将gap+end下标,也就是组内下一个数和前面的所有对比交换while (end >= 0){if (ary[end] > temp){ary[gap + end] = ary[end];end = end - gap;}else{break;}}ary[end + gap] = temp;}	
}

在这里插入图片描述
将红色组排好了序,接着将其他两组也排好序,意味着需要循环组数的次数,控制变量i

	int gap = 3;//循环gap组for (int j = 0; j < gap; j++){//从end+gap开始往前对比,找组内下一个数,每次加间距for (int i = j; i < len - gap; i += gap){int end = i;int temp = ary[gap + end];//将gap+end下标,也就是组内下一个数和前面的所有对比交换while (end >= 0){if (ary[end] > temp){ary[gap + end] = ary[end];end = end - gap;}else{break;}}ary[end + gap] = temp;}}}

在这里插入图片描述

上面的数字仍是无序的,但经过预排序已经大部分有序

上面的三层循环可以减到2层循环,最外层的循环可以去掉。实际上外面两层循环本质上是把所有数据遍历了一遍,所以可以只用一层,多组并排,i每次递增1

void ShellSort(int ary[], int len)
{int gap = 3;//从end+gap开始往前对比,找组内下一个数,每次加间距for (int i = 0; i < len - gap; i++){int end = i;int temp = ary[gap + end];//将gap+end下标,也就是组内下一个数和前面的所有对比交换while (end >= 0){if (ary[end] > temp){ary[gap + end] = ary[end];end = end - gap;}else{break;}}ary[end + gap] = temp;}
}

怎么让大部分有序的数据变为有序,只需要控制gap的变化,当gap=1时,就是插入排序。gap应该根据数据量变化,数据量大的时候,gap的跳跃变大,gap越大,越接近无序,但可以更快的将更大更小的数放在两端的位置

为了使排的数据最终变有序,gap的值最后必须可以变为1,官方给出的是gap每次/3+ 1,当gap为2时,就变为0,所以/3后再加1,这样无论多少数据,最终都会分为一组

void ShellSort(int ary[], int len)
{int gap = len;//gap>1预排序//gap=1插入排序while (gap > 1){//+1保证最后一次是1//gap = gap/2gap = gap / 3 + 1;//从end+gap开始往前对比,找组内下一个数,每次加间距for (int i = 0; i < len - gap; i++){int end = i;int temp = ary[gap + end];//将gap+end下标,也就是组内下一个数和前面的所有对比交换while (end >= 0){if (ary[end] > temp){ary[gap + end] = ary[end];end = end - gap;}else{break;}}ary[end + gap] = temp;}}}

时间复杂度
在这里插入图片描述
gap/3这一层时间复杂度log3N,因为每次都除以3。而对于里面的两个循环,时间复杂度计算比较麻烦,大致可认为是O(N)。因为gap每次都是变化的,且前面的排序对后面排序的增益效果无法估算
在这里插入图片描述
上面只能以最坏的情况计算,但gap越小,情况应该是越好的

特性
1.希尔排序是对直接插入排序的优化
2.当gap>1时是预排序,目的是让数组更接近有序。gap==1时,数组已经接近有序了,就会很快
3.时间复杂度: O(N1.3)
在这里插入图片描述

在这里插入图片描述

3.稳定性: 不稳定

3. 插入排序和希尔排序比较

随机生成10万个数字,计算两个排序所消耗的时间,大致差了100倍
在这里插入图片描述

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

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

相关文章

【知识整理】招人理念、组织结构、招聘

1、个人思考 几个方面&#xff1a; 新人&#xff1a;选、育、用、留 老人&#xff1a;如何甄别&#xff1f; 团队怎么演进&#xff1f; 有没有什么注意事项 怎么做招聘&#xff1f; 2、 他人考虑 重点&#xff1a; 1、从零开始&#xff0c;讲一个搭建团队的流程 2、标…

Python pandas中read_csv函数的io参数

前言 在数据分析和处理中&#xff0c;经常需要读取外部数据源&#xff0c;例如CSV文件。Python的pandas库提供了一个强大的 read_csv() 函数&#xff0c;用于读取CSV文件并将其转换成DataFrame对象&#xff0c;方便进一步分析和处理数据。在本文中&#xff0c;将深入探讨 read…

【网页设计】春节页面背景模板

无偿下载地址&#xff1a;https://download.csdn.net/download/weixin_47040861/88811143 1.实现效果 2.代码 1.html <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content&q…

go c 通过内存原始二进制内容直接传递结构体

go c 通过内存原始二进制内容直接传递结构体 传统数据传输通常通过半结构化数据(json/yaml/xml…)来交换信息。但是go 支持 二进制数据层面支持c 结构体。带来的好处就是相较于半结构化数据类型来说更快(在go中&#xff0c;解析和生成json/yaml/xml…到结构体都会经过一层反射…

【超高效!保护隐私的新方法】针对图像到图像(l2l)生成模型遗忘学习:超高效且不需要重新训练就能从生成模型中移除特定数据

针对图像到图像生成模型遗忘学习&#xff1a;超高效且不需要重新训练就能从生成模型中移除特定数据 提出背景如何在不重训练模型的情况下从I2I生成模型中移除特定数据&#xff1f; 超高效的机器遗忘方法子问题1: 如何在图像到图像&#xff08;I2I&#xff09;生成模型中进行高效…

推荐系统|召回04_离散特征处理

离散特征处理 离散特征是什么 怎么处理离散特征 One-hot编码 Embedding嵌入 从one-hot到Embedding&#xff0c;已经节省了很多的存储空间&#xff0c;但当数据量大的时候&#xff0c;还是占空间&#xff0c;所以工业界仍会对Embedding进行优化 而一个物品所对应的Embedding参数…

设计模式(前端)

设计模式 1.环境搭建 1&#xff09;初始化npm环境 下载node.js 执行npm init命令 (生成package.json) 根目录下&#xff0c;新建src文件夹&#xff0c;src文件夹下新建index.js文件&#xff1a; alert("Hello World");2&#xff09;安装webpack npm install webpa…

基于JSP的网上购书系统

点击以下链接获取源码&#xff1a; https://download.csdn.net/download/qq_64505944/88825694?spm1001.2014.3001.5503 Java项目-15 源码论文数据库配置文件 基于JSP的网上购书系统 摘要 在当今的社会中&#xff0c; 随着社会经济的快速发展以及计算机网络技术和通讯技术…

8种基本类型的包装类(与String的转换)

java针对8种基本数据类型&#xff0c;定义了相应的引用类型&#xff1a;包装类(封装类)&#xff0c;有了类的特点&#xff0c;就能调用类中的方法&#xff0c;java才是真正的面向对象。 基本数据类型 包装类byte Byteshort Shortint Integerlong Longfloat Floa…

国产光耦2024:发展机遇与挑战全面解析

随着科技的不断进步&#xff0c;国产光耦在2024年正面临着前所未有的机遇与挑战。本文将深入分析国产光耦行业的发展现状&#xff0c;揭示其在技术创新、市场需求等方面的机遇和挑战。 国产光耦技术创新的机遇&#xff1a; 国产光耦作为光电器件的重要组成部分&#xff0c;其技…

Python操作MySQL基础

除了使用图形化工具以外&#xff0c;我们也可以使用编程语言来执行SQL从而操作数据库。在Python中&#xff0c;使用第三方库: pymysql来完成对MySQL数据库的操作。 安装第三方库pymysql 使用命令行,进入cmd&#xff0c;输入命令pip install pymysql. 创建到MySQL的数据库连接…

CSS高级技巧

一、 精灵图 1.1 为什么需要精灵图&#xff1f; 1.2 精灵图&#xff08;sprites&#xff09;的使用 二、 字体图标 2.1 字体图标的产生 2.2 字体图标的优点 2.3 字体图标的下载 icomoom字库 http://icomoon.io 阿里iconfont字库 http://www.iconfont.cn/ 2.4 字体图标的引用…

Spring Boot 自定义指标

Spring Boot 自定义指标 阅读本文需要对一些前置技术有所了解,下面列出的一些前置技术是必须要了解的。 Prometheus:这是一个时序数据库,我们的指标数据一般保存在这个数据库中。Grafana:借助Grafana可以将Prometheus中的数据以图表的方式展示出来。Micrometer:是一个用于…

【EAI 013】BC-Z: Zero-Shot Task Generalization with Robotic Imitation Learning

论文标题&#xff1a;BC-Z: Zero-Shot Task Generalization with Robotic Imitation Learning 论文作者&#xff1a;Eric Jang, Alex Irpan, Mohi Khansari, Daniel Kappler, Frederik Ebert, Corey Lynch, Sergey Levine, Chelsea Finn 论文原文&#xff1a;https://arxiv.org…

分享76个表单按钮JS特效,总有一款适合您

分享76个表单按钮JS特效&#xff0c;总有一款适合您 76个表单按钮JS特效下载链接&#xff1a;https://pan.baidu.com/s/1CW9aoh23UIwj9zdJGNVb5w?pwd8888 提取码&#xff1a;8888 Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 学习知识费力气&#xff0c;收集…

python基础教程九 抽象四(函数参数终)

文章预览&#xff1a; 1. 分配参数2. 作用域3. 递归1. 俩个经典案例&#xff1a;阶层和幂2. 递归的意义1. 递归二分查找1. 二分查找的条件1. 二分查找的意义 1. 分配参数 前面介绍了如何将参数收集到元组和字典当中&#xff0c;但同样的俩个运算符&#xff0c;也可以执行相反的…

新版MQL语言程序设计:策略模式的原理、应用及代码实现

文章目录 一、什么是策略模式二、策略模式的实现原理三、策略模式的应用场景四、策略模式的代码实现 一、什么是策略模式 策略模式是一种行为型设计模式&#xff0c;它允许在运行时根据不同的情况选择算法的行为。该模式将算法封装成独立的类&#xff0c;并使它们可以互相替换&…

web3之跨链合成资产交易协议LINA (Linear)

什么是lina 官方网站&#xff1a;https://linear.finance/ Website: https://linera.io Discord: https://discord.gg/linera Medium: https://medium.com/linera Developer Docs: https://linera.dev Whitepaper: https://linera.io/whitepaper Linear Finance是首个跨链兼容…

会声会影绿幕抠图操作方法 会声会影绿幕抠图有绿色残边 绿幕抠图视频有绿边怎么处理 抖音怎么剪辑视频 视频剪辑软件推荐

科幻片里真的存在怪兽吗&#xff1f;外太空的画面是直接将演员放入太空拍摄的吗?其实这些不切实际的画面是通过绿幕拍摄实现的。你只需要在绿幕前拍一段太空漫步的视频&#xff0c;再利用会声会影的抠图功能就能实现&#xff01;如果你还不会绿幕抠图&#xff0c;我今天就手把…

《杨绛传:生活不易,保持优雅》读书摘录

目录 书简介 作者成就 书中内容摘录 良好的家世背景&#xff0c;书香门第为求学打基础 求学相关 念大学 清华研究生 自费英国留学 法国留学自学文学 战乱时期回国 当校长 当小学老师 创造话剧 支持钱锺书写《围城》 出任震旦女子文理学院的教授 接受清华大学的…