插入排序和希尔排序

插入排序

插入排序就是从第一个数开始,将前面的数都想成有序序列,将后一个数与前面的所有数比较排序。就好像我们玩扑克牌,先将手里的牌排好序,然后抽到的新牌再和前面的牌排序,这就是插入排序,下面有一个动图,能够帮助大家更好的理解。

是不是已经理解了呢。

但是我们要用代码实现,应该怎么做呢?

代码实现

我们先实现单趟的插入排序,定义一个end,从这个end开始,我们将他后面的数字依次与前面的

比较,但是我们不能直接拿aend+1与aend比,我们就定义一个tmp,将aend+1赋值给tmp,依次与前面的每个数比较,如果有比tmp大的,那就将aend+1覆盖掉,覆盖之后将end--,然后再与前面的比较,直到碰到了比tmp小的,就可以跳出循环,然后将end后面所在的位置被tmp覆盖掉。这样就实现了排序,但是呢,这只是单趟的,我们就还要设计一个循环,但是这个就很简单了,所以我就不做过多解释了,我们看代码。

实现过程还是很简单的,主要就是看思路,学会这种思想是最重要的。

希尔排序

希尔排序其实是插入排序的改良版,我们来详细了解一下,这个希尔排序呢,分为两步,第一步:预排序,第二步:插入排序。简单点说就是先将数组排序成接近有序的数组,再进行插入排序,大家听着是不是很麻烦感觉消耗的很多,其实这个速度很快,比我们上面将的插入排序快得多,也比我们之前学的冒泡排序要快的多,只能说希尔也是个神人,哈哈哈。

具体操作

具体的操作呢,就是如下图所示

分别排序之后就是这样的

是不是大的数字就往后面跑,小的数字就往前面跑。这样进行插入排序就会变得快很多。

gap的选取

其实gap == 1就是我们的插入排序,我们可以看代码对比

里面的单趟就是一样的,只有一个gap的区别,而gap我们就取gap= gap/3+1.其实也没有特别的规定必须取3,而是有人研究过/3是最好的,就像malloc空间一样,一般malloc2倍,我们gap就取/3,+1是为了防止gap变为0.

好了,整体的思路讲完了,我们看看代码就能理解这个希尔排序了。

相关推荐
qeen878 分钟前
【数据结构】自平衡二叉搜索树各种旋转算法原理解析及AVL树的C++实现
数据结构·c++·算法
lucas_AI19 分钟前
1.2B 小模型赢过 235B 大模型:NaviDC-OCR 把文档解析卷明白了
人工智能·深度学习·算法
程序员与背包客_CoderZ38 分钟前
Linux D-Bus通信协议详解:从入门到C/C++编码实战
linux·服务器·c语言·c++·嵌入式硬件·嵌入式软件·dbus
冻柠檬飞冰走茶1 小时前
PTA基础编程题目集 7-35有理数均值(C++语言实现)
开发语言·数据结构·c++·算法·均值算法
民乐团扒谱机1 小时前
【微实验】倒谱算法(Cepstrum)深度解析:原理、数学推导与代码实现
人工智能·算法·语音识别
嵌入式阿蔡2 小时前
HAL库 vs LL库 vs 寄存器:到底用哪个?
c语言·stm32·单片机·嵌入式硬件·嵌入式实时数据库
Yyyyyy~2 小时前
【C】C语言常见概念
c语言
Nil2082 小时前
leetcode 189轮转数组
数据结构·算法·leetcode
-dzk-2 小时前
【动态规划】LC 118.杨辉三角
算法·动态规划
恣逍信点3 小时前
《凌微经》静态自悖——变化之自因
人工智能·科技·算法·机器学习·业界资讯·拓扑学·哲学