插入排序与希尔排序 - 实践

news/2025/9/19 21:28:58/文章来源:https://www.cnblogs.com/tlnshuju/p/19101738

插入排序与希尔排序 - 实践

2025-09-19 21:28  tlnshuju  阅读(0)  评论(0)    收藏  举报

笔者把源码放在github上了:Fundamentals-of-Data-Struct/Sort at main · z-yi-han/Fundamentals-of-Data-Struct

本文笔者带领读者进行排序的学习,今天我们学习插入排序与希尔排序。

首先,我们先介绍插入排序。读者可能不知道什么是插入排序,笔者给大家举个例子:打扑克牌的时候整理牌,其实这就是一种插入排序,所以我们不难理解插入排序:给定一个数组,取一个元素,在这个元素与其前面的元素一一对比,碰到大于他的就交换位置(这里是升序,降序就是小于),依次从第一个元素开始每个都和前面比较即可,对应的下标是【0,n-1】。对于排序挑战,不管是什么排序,我们都要先把一趟的代码写出来再总循环一次,下面我们就开始写插入排序一趟的代码:

首先,我们考虑范围,数组要用下标为参考,假设需要插入的元素下标是end+1,前面就是【0,end】,因此我们只需要一个一个对比,再判断即可:

观察上面的代码,首先定义了end,i其实是方便整体循环,然后笔者把a[end+1]存起来了,这是因为这样这个位置对应的值可能改变,然后直接开始比即可,从后往前比,如果满足条件,那就把end往前动一个单位,假如不符合直接跳出,最终,这个最开始存的再让他回去就行,不过需要注意的是,这一步需推出while循环在进行,这是为了方便,然后在套在循环里:

结果大家可以做个测试:

随后我们可以分析一下插入排序的时间复杂度:首先考虑最坏情况,假如说全部都是逆序,也就是说从最后一个就全部遍历,也就构成了一个等差数列,时间复杂度就是O(N^2),倘若是最好情况,那么也就是O(N),因此这种排序的时间复杂度是O(N^2)。

下面,笔者介绍一种比较抽象的排序——希尔排序:

希尔排序其实也是插入排序,但是时间复杂度得到了很大的优化,这是由于希尔排序的特点——预排序+插入排序。首先,笔者先带领读者一步一步分析一下希尔排序:正常的快速排序,gap越大,跳的越快,越无序。下面给定一个数组:就是希尔排序法又称缩小增量法,预处理是为了让其更接近有序,也就是说在接近有序的基础上再进行排序会让插入排序的效率优化很多,因此大家先思考什么是预处理:其实就是先分组,选一个值gap,然后从第一个值开始分组,每间隔gap的元素为一个组,然后对这个组里的元素进行插入排序,需要注意的是,这里gap的选择理论上是都可行的,不过经过计算,gap取3是最合适的,当然gap取1的时候就9 1 2 5 7 4 8 6 3 5

假如gap是3,那么一组就是9 5 8 5,笔者写一段代码对这段进行排序:

其实就是一个快速排序,但是这里笔者没有把i的范围写上,笔者希望读者和笔者一同思考这个范围是什么,我们都知道数组不能进行越界访问,因为i的范围就是为了防止越界访问,一共有n个元素,但是这组中两两间隔为gap,所以i必须<n-gap,因为如果i等于它,end+gap就会是n,造成越界,故代码如下图:

gap的控制,gap取3会比较合适,这里用了一下就是这是其中一组的,这组进行之后,排序还没结束,应该继续进行,所以这里得一个while循环,不过这里需要注意的Knuth 序列gap = gap / 3 + 1:

然后这种排序的时间复杂度比较麻烦,读者记住即可:O(N^1,3),感兴趣的读者可自行查阅。

最后进行一个小测试:

希望读者能给笔者点个赞。

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

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

相关文章

最新IDEA 2025 专业版破解永久破解教程(附资源)intellij IDEA

一、intellij idea软件下载 [软件名称]:intellij idea 克网盘下载链接:https://pan.quark.cn/s/2af0fb5ec2e5 迅雷文件分享:Intellij IDEA 2025链接:https://pan.xunlei.com/s/VO_X5mj3eocLmO5BuL5ztWKhA1?pwd=uw…

AtCoder ABC423F - Loud Cicada 题解 容斥原理

题目大意: 问 \([1, Y]\) 范围内有多少个数是:\(A_1, A_2, \ldots, A_N\) 中恰好 \(K\) 个数的倍数。 解题思路: 容斥原理。 思路完全来自 StelaYuri大佬的博客。 示例程序: #include <bits/stdc++.h> using…

1756:八皇后

题目 总时间限制: 1000ms 内存限制: 65536kB 描述 会下国际象棋的人都很清楚:皇后可以在横、竖、斜线上不限步数地吃掉其他棋子。如何将8个皇后放在棋盘上(有8 * 8个方格),使它们谁也不能被吃掉!这就是著名的八皇…

矩阵置零-leetcode

题目描述 给定一个 *m* x *n* 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 示例 1:输入:matrix = [[1,1,1],[1,0,1],[1,1,1]] 输出:[[1,0,1],[0,0,0],[1,0,1]]示例 2:输…

重新开始配置hadoop等

重新开始配置hadoop等1

IIS 部署 asp.net core 实用的方案时,出现500.19、500.31问题的解决方案

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

嘉立创常用快捷键

在EDA设计中使用快捷键能帮我们快速完成设计, 本人使用的是嘉立创EDA专业版,快捷键设置可以打开设置如下图打开之后我们可以对快捷键进行调整设置。附常用快捷键: 基础操作 空格键:旋转所选图形。 R:旋转图形。 X:…

02020402 EF Core基础02-EF Core数据的增删改查

02020402 EF Core基础02-EF Core数据的增删改查 1. EF Core数据的增删改查(视频3-3)创建.NET Core控制台项目,项目文档如下。// Book.cs using System;namespace EF CoreDemo {public class Book{public long Id {…

conda 无法安装依赖 CondaHTTPError: HTTP 000 CONNECTION FAILED for url: tsinghua tencentaliyun

在成功安装conda软件后, 尝试安装python 虚拟环境 或 python 依赖包,但报CondaHTTPError,查阅网上资料说:将下载源更换成 国内源(tsinghua/aliyun/tencent),但下载时依旧报相同的错. PS C:\Users\xxx> conda cr…

牛客刷题-Day2

动态规划1:线性dp、背包问题,区间 https://ac.nowcoder.com/acm/contest/24213?from=acdiscuss牛客刷题-Day2 今日题目:\(1006-1010\) 1006 免费馅饼 题目描述 \(SERKOI\) 最新推出了一种叫做“免费馅饼”的游戏:…

实用指南:kafka 原理详解

实用指南:kafka 原理详解2025-09-19 21:06 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; f…

图解支付系统账务系统核心设计 - 智慧园区

支付系统的稳定运行离不开账务系统的支撑,其需精准处理资金流与信息流,涵盖账户分类、复式记账、清结算对账等核心模块,深入理解其设计逻辑,是搭建可靠支付架构的关键。在前一篇的“图解支付系统账务系统设计入门”…

网络编程-HTTP - 详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

vulnhub(持续更新)

内网渗透的靶场,复现cve也挺有意思的vulnhub Earth 一、信息收集二、端口扫描三开始渗透发现直接访问貌似访问不进去,仔细查看nmap扫描结果发现两条dns记录,可以知道192.168.44.133会被dns服务器解析为earth.local,…

小爱同学连接电脑进行交互 教程

所需材料 我们希望整个过程的材料尽量简化。以下是必备的设备:小爱音箱(如 Redmi 音箱 Play) 一台支持 Docker 的设备(如小主机,NAS,或电脑) 你需要控制的电脑实现流程 整个实现路径如下:传输指令:我们通过小…

网络流初步浅谈:EK与Dinic

\(\LARGE 网络流这么美妙的东西\) \(\LARGE 肯定是要好好学它的\)主要还是为了搞这个二分最大匹配去学的 匈牙利算法不太适合我,就来进阶一下(先来看最大流最大流是解决从源点到汇点的最大流量,这是个网络流中几乎最…

Spring框架事件驱动架构核心注解之@EventListener - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

FreeRTOS SMP 资料收集

FreeRTOS SMP 资料收集1、 官方demo FreeRTOS/FreeRTOS-Community-Supported-Demos

解码C语言结构体

一、结构体的定义与声明 结构体是一种 自定义数据类型,用于将多个不同类型的变量组合成一个整体。 1. 定义结构体类型 struct Student {char name[20];// 字符数组成员int age;// 整型成员float score;// 浮点型成员 …

已完成今日求所有满足长为 $a$ 的和为 $b$ 的按位或为 $c$ 的非负整数序列的异或和的异或和大学习

给定 \(a\),\(b\),\(c\)。 求所有满足长为 \(a\) 的和为 \(b\) 的按位或为 \(c\) 的非负整数序列的异或和的异或和。 \[c\le 2^{20}, a \le 2^{40}, b \le 2^{60} \] 所有方案轮换对称,所以仅考虑 \(n\) 为奇数。 钦…