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

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


文章目录

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


前言

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

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


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

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

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

插入排序的思想就是:假设前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,一经查实,立即删除!

相关文章

我的孤独谁懂,我需要伴侣

​在这个充满喧嚣却又充满孤独的世界中&#xff0c;我一直在寻找那个能够理解我的人。我知道&#xff0c;这样的渴望并非出于虚荣或者依赖&#xff0c;而是源自人类最深层的共鸣——对爱与被爱的向往&#xff0c;对陪伴与理解的渴求。我的孤独&#xff0c;如同一股无声的呼唤&a…

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;在阵列右侧正中…

VScode创建python项目虚拟环境

1. 进入项目目录 2. 打开terminal 3. 创建virtual env 语法python -m venv name示例python -m venv venv&#x1f431;: 执行完成能在当前目录下看到虚拟环境的目录 4. 激活虚拟环境 linuxsource venv/bin/activatewindowsvenv/scripts/activate5. 在虚拟环境下搭建项目环…

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 中间件的初体验 定义中间件函数 全局生效的中间件 定义全局中间件的简化形式 中间件的作用 ​编辑 定义多个全局中间件 局部生…

SD00HA 集成电路IC电压负载开关USB电源降压SOT23-5封装

该SD00HA是一种具有成本效益的&#xff0c;低 电压&#xff0c;单P-MOSFET负载开关&#xff0c;自供电 和总线供电的通用串行总线(USB)应 用优化。该开关的输入范围为2.4V至5. 5V&#xff0c;非常适合3V和5V系统。该开关的低 Rps (ON)80mΩ&#xff0c;满足USB电压降要 求。该S…

Flutter 中的 Stepper 小部件:全面指南

Flutter 中的 Stepper 小部件&#xff1a;全面指南 在 Flutter 应用中&#xff0c;Stepper 是一种用于创建向导式界面或分步表单的小部件。它允许用户通过一系列的步骤完成一个过程&#xff0c;每个步骤可以包含不同的表单字段或用户交互。Stepper 通常用于注册流程、结账流程…

前端绘制流程节点数据

根据数据结构和节点的层级、子节点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框架中使用了哪些设计模…

ENZO--Protein A EIA Kit

金黄色葡萄球菌细胞壁的组成成份蛋白A能够特异性结合免疫球蛋白特别是免疫球蛋白G的Fc端。重组蛋白&#xff0c;抗体和疫苗等纯化过程中使用的填料中有蛋白A&#xff0c;尽管蛋白A是共价形式存在于填料中&#xff0c;但是在色谱洗脱过程中蛋白A会一起浸出。蛋白A的污染严重地影…

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;如字体、段落、表格、图片等…

疲劳荷载的马尔科夫频次表示

文章目录 0 背景描述1 文章概述 0 背景描述 关于风电塔筒荷载中的马尔科夫矩阵&#xff0c;一直很好奇。最主要还是因为想要从两个已知截面的马尔科夫矩阵得到附近的另一个截面的载荷&#xff0c;我一直认为这件事情是可以完成的&#xff0c;但是因为对马尔科夫矩阵不太了解所…

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

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

sql server使用 SELECT INTO 进行数据表备份和创建临时中间表

在数据库操作中&#xff0c;常常需要将数据从一个表复制到另一个表&#xff0c;或将部分数据保存到一个新的表中进行进一步操作。SELECT INTO 是一个强大的 SQL 语句&#xff0c;可以在 SQL Server 和部分其他数据库系统中实现这一功能。本文将讨论如何使用 SELECT INTO 进行数…

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

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