【排序算法】插入排序和希尔排序

制作不易,三连支持一下吧!!!


文章目录

  • 前言
  • 插入排序的原理及实现
  • 希尔排序的原理及实现
  • 总结


前言

从这篇博客开始,我们将介绍几种常见的排序算法!

插入排序算法是希尔排序的基础,所以理解希尔排序前一定要先理解插入排序!!!


一、插入排序的原理及实现

相信大家在日常生活中都打过扑克牌,当我们要整理牌序时,是不是就是将新摸到的牌直接插入到它合适的位置,然后再摸一张牌,循环上述过程,最后我们手里的牌都变得有序了。

我们这里要介绍的插入排序原理和整理扑克牌的原理是相同的。

插入排序的思想就是:假设前n项已经有序,然后将第n+1项插入进去,使得前n+1项也变得有序,循环往复,直到最后一个数据也插入有序后,整个数据就有序了。 

动画演示如下:

我们先来实现单趟插入排序

单趟插入排序就是在前面的有序序列中从后向前依次比较,假设我们要排成升序,那我们就要找比要插入的数据小的值,遇到比他大的值就继续向前,最后将新数据放到第一个比他小的值得后面。

代码实现:

		int end = i;int tmp = a[end + 1];while (end >= 0){if (tmp < a[end]){a[end + 1] = a[end];end--;}else {break;}}a[end + 1] = tmp;

然后我们只需要让他循环单趟操作,并更新end的值即可。

注意因为我们这里新插入的元素的下标是end+1,所以end的范围应该是【0,n-2】,n是数组的元素个数。 

代码实现:

//直接插入排序
void InsertSort(int* a, int n)
{for (int i = 0; i < n - 1; i++){int end = i;int tmp = a[end + 1];while (end >= 0){if (tmp < a[end]){a[end + 1] = a[end];end--;}else {break;}}a[end + 1] = tmp;}
}

 

我们分析一下直接插入排序的时间复杂度:

按最坏的情况考虑,那就是所给序列与我们要排的序列是逆序的,这样我们每次插入新数据时都会插入在下标为0的位置,这种情况下每次插入的消耗是最大的。

这样可得O(N)=1+2+3+…+(n-1)=  \frac{(n)(n-1)}{2}.

所以时间复杂度为N^2.

二、希尔排序的原理及实现

希尔排序是希尔研究直接插入排序时发现,如果所给序列很接近有序,那么直接插入排序的效率就非常高,达到O(N),在排升序的情况下,他认为,如果新插入的元素较小,那么我们需要一步一步将他挪动到开头的位置处,这样操作效率太低。所以他就想到,以gap为间距,来进行直接插入排序,这样经过多次后,整个序列将会接近有序,最后再以gap为1进行一次直接插入排序,整个序列就有序了!!!

实现逻辑: 

① 先取一个小于n的整数d1作为第一个增量,把文件的全部记录分成d1个组。
② 所有距离为d1的倍数的记录放在同一个组中,在各组内进行直接插入排序。
③ 取第二个增量d2小于d1重复上述的分组和排序,直至所取的增量dt=1(dt小于dt-l小于…小于d2小于d1),即所有记录放在同一组中进行直接插入排序为止。 

动图演示:

我们还是先来实现单趟:

 希尔排序的单趟与直接插入排序十分相似,因为希尔排序中的gap==1时就是直接插入排序

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;

然后我们还是再套一层循环,让它重复上述过程。

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;
}

最后再套一层循环来实现不同gap的多次预排序。 

void ShellSort(int* a, int n)
{int gap = n;while (gap > 1){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;}}
}

最后,我们的希尔排序就写好了!!! 

下面我们对希尔排序的性能分析一下:

希尔排序的时间复杂度难以计算,我们只能通过大量数据分析得出规律。

希尔排序的时间复杂度是 O (n^ (1.3-2)) ,空间复杂度为常数阶 O (1)1234。希尔排序的效率取决于它的增量序列5。希尔排序的基本思想是先将整个待排序列分割成若干个子序列,分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的记录“基本有序”时,再对全体记录进行一次直接插入排序2。希尔排序的时间复杂度与增量序列的选择有关,最坏情况下为O (n^2),最好情况下为O (n log n)2


总结

希尔排序是直接插入排序的升级,我们理解了直接插入排序,希尔排序应该会很轻松。

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

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

相关文章

QT5.15.2及以上版本安装

更新时间&#xff1a;2024-05-20 安装qt5.15以上版本 系统&#xff1a;ubuntu20.04.06 本文安装&#xff1a;linux-5.15.2 下载安装 # 安装编译套件g sudo apt-get install build-essential #安装OpenGL sudo apt-get install libgl1-mesa-dev# 下载qt安装器 https://downl…

Centos 7.9 使用 iso 搭建本地 YUM 源

Centos 7.9 使用 iso 搭建本地 YUM 源 1 建立挂载点 [rootlocalhost ~]# mkdir -p /media/cdrom/ 2 创建光盘存储路径 [rootlocalhost ~]# mkdir -p /mnt/cdrom/ 3 上传 CentOS-7-x86_64-Everything-2207-02.iso 到 光盘存储路径 [rootlocalhost ~]# ls /mnt/cdrom/ CentOS-…

echarts取消纵坐标,自定义提示内容,完整 echarts 布局代码

效果图 实现代码 开启点击柱子时的提示内容 //完整写法请看下面tooltip: {trigger: axis,axisPointer: {type: shadow}},自定义提示内容 //完整写法请看下面formatter: function (param) {// param是悬浮窗所在的数据&#xff08;x、y轴数据&#xff09;let relVal "&…

免费,Python蓝桥杯等级考试真题--第10级(含答案解析和代码)

Python蓝桥杯等级考试真题–第10级 一、 选择题 答案&#xff1a; 解析&#xff1a;range取首不取尾&#xff0c;即产生了数1234&#xff0c;list&#xff08;&#xff09;函数可以把产生的数1234转化为列表&#xff0c;故答案为A。 答案&#xff1a;B 解析&#xff1a;sort&a…

【芯片IC】常见拆解欣赏 单片机、FPGA、RS232

1. Giga Devices GD32F103CBT6 2.Altera Cyclone EP1C3 is the smallest 1-st generation FPGA from Altera. 在多晶硅层面&#xff0c;我们可以看到每个 M4K 块被细分为两半&#xff08;两列共 26 个 “矩形”&#xff09;。逻辑元件阵列是非对称的&#xff0c;在阵列右侧正中…

jetcache缓存

1 介绍 是阿里的双极缓存&#xff0c;jvm-->redis-->数据库 文档&#xff1a;jetcache/docs/CN at master alibaba/jetcache GitHub 2 注意事项 使用的实体类一定实现序列化接口定时刷新注解&#xff0c;慎用 它会为每一个key创建一个定时器 &#xff1a;场景为&…

Node.js —— Express 中间件、接口编写、接口跨域 【0基础向Express模块学习】

目录 中间件的概念 什么是中间件 现实生活中的例子 Express 中间件的调用流程 ​编辑 Express 中间件的格式 next 函数的作用 Express 中间件的初体验 定义中间件函数 全局生效的中间件 定义全局中间件的简化形式 中间件的作用 ​编辑 定义多个全局中间件 局部生…

前端绘制流程节点数据

根据数据结构和节点的层级、子节点id&#xff0c;前端自己绘制节点位置和关联关系、指向、已完成节点等 <template><div><div>通过后端节点和层级&#xff0c;绘制出节点以及关联关系等</div><div class"container" ref"container&…

java面试框架篇(Spring常见问题、SpringBoot、SpringMVC、mybatis经典问题、SpringCloud组件)

文章目录 面试专题-java框架篇1. spring常见问题1.1. spring是什么?1.2. 谈谈你对AOP的理解1.3. 谈谈你对IOC的理解1.4. Spring Boot、 Spring MVC和Spring有什么区别1.5. spring bean 生命周期1.6. spring事务传播机制有哪些?1.7. 循环依赖1.8. spring框架中使用了哪些设计模…

vue3插槽solt 使用

背景增加组件的复用性&#xff0c;个人体验组件化还是react 方便。 Vue插槽solt如何传递具名插槽的数据给子组件&#xff1f; 一、solt 原理 知其然知其所以然 Vue的插槽&#xff08;slots&#xff09;是一种分发内容的机制&#xff0c;允许你在组件模板中定义可插入的内容…

Python 实现Word (DOC或DOCX)与TXT文本格式互转

目录 引言 安装Python库 使用Python将Word转换为TXT文本格式 使用Python将TXT文本格式转换为Word 引言 Word文档和TXT文本文件是日常工作和生活中两种常见的文件格式&#xff0c;各有其特点和优势。Word文档能够保留丰富的格式设置&#xff0c;如字体、段落、表格、图片等…

Java入门基础学习笔记42——常用API

API&#xff08;全称&#xff1a;Application Programming Interface&#xff1a;应用程序编程接口&#xff09; 就是Java自己写好的程序&#xff0c;给程序员调用&#xff0c;方便完成一些功能的。 为什么要学别人写好的程序&#xff1f; 不要重复造轮子。 开发效率高。 面…

YOLOv5改进 | 主干网络 | 用repvgg模块替换Conv【教程+代码 】

&#x1f4a1;&#x1f4a1;&#x1f4a1;本专栏所有程序均经过测试&#xff0c;可成功执行&#x1f4a1;&#x1f4a1;&#x1f4a1; 尽管Ultralytics 推出了最新版本的 YOLOv8 模型。但YOLOv5作为一个anchor base的目标检测的算法&#xff0c;YOLOv5可能比YOLOv8的效果更好。…

2024电工杯数学建模选题建议及各题思路来啦!

大家好呀&#xff0c;2024电工杯数学建模竞赛开始了&#xff0c;来说一下初步的选题建议吧&#xff1a; 首先定下主基调&#xff0c; 本次电工杯建议选B。A题目难度较高&#xff0c;只建议有相关专业知识和优化经验的队伍选择&#xff0c;小白队伍无脑选B即可。是比较经典的数…

网页加载时,大图片文件如何分片加载,有示例代码。

浏览网页时候&#xff0c;碰到大图片半天加载不出来&#xff0c;急死人&#xff0c;本问分享一种分片加载的方式&#xff0c;其实还有其他方式&#xff0c;比如先模糊后清晰等。 一、为什么要分片加载 大图片文件可以通过分片加载来提高加载性能和用户体验。分片加载的基本思…

PointCloudLib 点云Ransac拟合平面功能实现 C++版本

0.实现效果 左图为原始点云,右图中的红色点为拟合平面所选取的点,绿色的点为拟合平面所抛弃的点 拟合出的结果是一个平面方程。 1.算法原理 RANSAC(Random Sample Consensus,随机样本一致性)算法在拟合平面时的工作原理可以概括为以下几个步骤: 随机选择最小样本集: R…

PTK密钥传递攻击

一. PTK密钥传递攻击原理 1. PTK介绍 PTK(Pass The key)&#xff0c;中文叫密钥传递攻击&#xff0c;PTH传递中&#xff0c;使用的是NTLM-HASH值&#xff0c;PTK使用 AES256或者AES128的方式进行传递,PTK 攻击只能用于kerberos认证中,NTLM认证中没有&#xff01; 2.PTK的原理…

官宣!正式成为淡人!向数据备份焦虑Say NO!

连轴转了十几天&#xff0c;想着终于要迎接美好的双休了&#xff0c;焦躁的心都变淡了。 但有时候压死骆驼的不是最后一根稻草&#xff1b; 当我终于剪好视频&#xff0c;满心欢喜导出时&#xff0c;却收到了一个令人沮丧的提示&#xff1a; “存储空间不足&#xff0c;请清…

本地连不上远程阿里云MySQL数据库,密码对就是连不上

三步解决 设置安全组&#xff1a; 设置防火墙&#xff1a; iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 3306 -j ACCEPT设置root用户连接host&#xff1a; 终端登录mysql&#xff0c;然后&#xff1a; use mysql; select user,host from user where use…

VUE3好看的酒网站模板源码

文章目录 1.设计来源1.1 首页界面1.2 十大名酒界面1.3 名酒新闻界面1.4 联系我们界面1.5 在线留言界面 2.效果和结构2.1 动态效果2.2 代码结构 3.VUE框架系列源码4.源码下载 作者&#xff1a;xcLeigh 文章地址&#xff1a;https://blog.csdn.net/weixin_43151418/article/detai…