[数据结构]——排序——插入排序

ops/2024/10/20 10:04:21/

目录

​编辑

1 .插入排序

1.基本思想:

2.直接插入排序: 

 ​编辑

1.代码实现 

 2.直接插入排序的特性总结:

3.希尔排序( 缩小增量排序 )

 1.预排序

 2.预排序代码

3.希尔排序代码

4.希尔排序的特性总结:


 

1 .插入排序


1.基本思想:

直接插入排序是一种简单的插入排序法,其基本思想是:把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为止,得到一个新的有序序列 。

 

2.直接插入排序: 

当插入第i(i>=1)个元素时,前面的array[0],array[1],…,array[i-1]已经排好序,此时用array[i]的排序码与array[i-1],array[i-2],…的排序码顺序进行比较,找到插入位置即将array[i]插入,原来位置上的元素顺序后移

 

1.代码实现 

排序过程如下:

  1. 从数组的第二个元素开始,依次将其与前面的元素进行比较。
  2. 如果当前元素比前面的元素小,则将前面的元素后移一位。
  3. 继续比较前面的元素,直到遇到比当前元素小的元素,或者已经比较到数组的第一个元素。
  4. 将当前元素插入到空出来的位置上。
  5. 重复以上步骤,直到所有元素都被插入到合适的位置上。

实际上,这个算法>排序算法的思想就是将数组分为已排序部分和未排序部分,每次从未排序部分选择一个元素并插入到已排序部分的合适位置上。

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

 2.直接插入排序的特性总结:

1. 元素集合越接近有序,直接插入算法>排序算法的时间效率越高
2. 时间复杂度:O(N^2)
3. 空间复杂度:O(1),它是一种稳定的算法>排序算法
4. 稳定性:稳定

在实际应用中,如果待排序的数组已经基本有序,那么插入排序的效率会比较高。但是对于逆序数组或者随机排序的数组,插入排序的效率会比较低。因此,插入排序通常用于对小规模数据或者部分有序数据的排序。

3.希尔排序( 缩小增量排序 )


希尔排序法又称缩小增量法。希尔排序法的基本思想是:先选定一个整数,把待排序文件中所有记录分成个组,所有距离为的记录分在同一组内,并对每一组内的记录进行排序。然后,取,重复上述分组和排序的工作。当到达=1时,所有记录在统一组内排好序。 

 

 1.预排序

预排序是指在希尔排序之前,先将序列进行一次插入排序,将相隔一个增量的元素进行排序。这样可以将序列的一些小的逆序对提前消除,使得希尔排序的效率更高。

具体的希尔排序预排序的过程如下:

  1. 选择一个增量gap序列,通常取序列长度的一半作为初始增量。
  2. 根据增量gap将序列分成若干个分组,每个分组包含相邻的元素。
  3. 对每个分组进行插入排序,即将每个元素与其前面的元素进行比较并交换位置,直到该元素在该分组中的位置正确为止。
  4. 缩小增量,重复步骤2和步骤3,直至增量为1,即对整个序列进行一次插入排序。

 预排序是指在排序过程中,每次对分组进行插入排序之前,先对整个序列进行一次插入排序。这样做的目的是减少插入排序的比较和交换次数,从而提高排序效率。预排序的实现方法是在每次缩小增量时,将待排序序列进行一次插入排序。

 2.预排序代码

for(int j=0; j<gap ;j++)
{
for (int i = j; i < n - gap; i++){int end = i;int temp = a[end + gap];while (end >= 0){if (temp <a[end]){a[end + gap] = a[end];end-=gap;}else{break;}}a[end + gap] = temp;}
}

3.希尔排序代码

希尔排序的基本思想是将待排序序列分成若干个子序列,对每个子序列进行排序,然后逐步减小增量,最终整个序列就变成了有序序列。

具体的希尔排序过程如下:

  1. 初始化增量 gap = n / 3 + 1。
  2. 使用 gap 对序列进行分组,分为 gap 个子序列。
  3. 对每个子序列进行插入排序,即将每个元素与其前面的元素进行比较并交换位置,直到该元素在该子序列中的位置正确为止。
  4. 减小增量 gap,重复步骤2和步骤3,直至增量为1,即对整个序列进行一次插入排序。

希尔排序的特点是可以提前将较小的元素向前移动,从而减少后续插入排序的比较次数和交换次数,从而提高排序效率。

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 temp = a[end + gap];while (end >= 0){if (temp > a[end]){a[end + gap] = a[end];end-=gap;}else{break;}}a[end + gap] = temp;}}
}

4.希尔排序的特性总结:

1. 希尔排序是对直接插入排序的优化。
2. 当gap > 1时都是预排序,目的是让数组更接近于有序。当gap == 1时,数组已经接近有序的了,这样就会很快。这样整体而言,可以达到优化的效果。我们实现后可以进行性能测试的对比。
3. 希尔排序的时间复杂度不好计算,因为gap的取值方法很多,导致很难去计算,因此在好些树中给出的希尔排序的时间复杂度都不固定;


http://www.ppmy.cn/ops/7547.html

相关文章

小米K8s运维-云原生方向(面经分享)

大家好&#xff0c;我是秋意零。今天分享一篇小米运维面经。 小米K8s运维-云原生方向 一面 2024年4月3日 | 10点 | 一面 | 40 min 左右 1&#xff09;自我介绍 2&#xff09;你熟悉Python多一点吗&#xff1f;还熟悉其它语言吗&#xff0c;拿出来写过的&#xff1f; 3&am…

每日三个JAVA经典面试题(三十七)

1.大对象和小对象在内存分配上有什么不同&#xff1f; 大对象和小对象在内存分配上有几个主要的不同之处&#xff1a; 内存分配方式&#xff1a; 小对象&#xff1a;通常分配在堆上&#xff0c;使用堆分配器&#xff08;如malloc/free或new/delete&#xff09;进行管理。小对象…

Neural Radiance Fields (NeRF) 和 3D Gaussian Splatting区别

Neural Radiance Fields (NeRF) 和 3D Gaussian Splatting 是两种用于3D场景重建和渲染的技术。它们都旨在创建高质量的3D图像&#xff0c;但它们的技术原理和应用场景有所不同。 1. Neural Radiance Fields (NeRF) NeRF使用深度学习技术&#xff0c;特别是一种密集的神经网络…

svn使用(上传自己的项目到svn上)

安卓开发工具版本 创建项目后&#xff0c;首先在.gitgnore文件里面加入你要过滤的文件路径 然后点击VCS——》share Project&#xff0c;然后下一步选择一个svn路径&#xff0c;点击确定后。然后将代码提交。

HTML的学习-通过创建相册WEB学习HTML-第一部分

文章目录 一、设置中文1.1、添加中文插件1.2、配置显示中文语言 二、学习开始2.1、创建项目文件夹2.2、h1标签示例&#xff1a;生成HTML框架示例&#xff1a;添加h1标签 2.3、h2标签示例&#xff1a;在h1标签下添加h2标签 2.4、h1标签到h6标签层次解析2.5、p标签示例&#xff1…

js高级 笔记02

目录 01 object提供的一些静态方法 02 词法作用域 03 作用域链 04 arguments的使用 05 开启严格模式 06 高阶函数 07 闭包 01 object提供的一些静态方法 Object.create() 对象继承 Object.assign(对象1,对象2) 对象合并 可以将对象2 里面的可枚举属性和自身的属性合并到…

Linux-缓冲区(简单理解)

1. 缓冲区是什么 缓冲区就是一段内存空间。 2. 为什么要有缓冲区 IO写入有两种&#xff1a; 写透模式&#xff08;WT&#xff09; 成本高&#xff0c;效率低写回模式&#xff08;WB&#xff09; 成本低&#xff0c;效率高 写透模式&#xff1a;每次的文件写入都要立即刷新…

【Django】django.core.exceptions.AppRegistryNotReady: Apps aren‘t loaded yet.

其中django后台manage.py入口程序报错&#xff0c;检索很多问题解决方案&#xff0c;这里记录下个人问题原因 1.django启动异常问题详情 django.core.exceptions.AppRegistryNotReady: Apps aren’t loaded yet. 2.问题原因 Python第三方包安装版本不一致或缺少依赖包&…