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

目录

​编辑

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.mzph.cn/web/1517.shtml

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

相关文章

从头开始构建自己的 GPT 大型语言模型

图片来源&#xff1a; Tatev Aslanyan 一、说明 我们将使用 PyTorch 从头开始构建生成式 AI、大型语言模型——包括嵌入、位置编码、多头自注意、残差连接、层归一化&#xff0c;Baby GPT 是一个探索性项目&#xff0c;旨在逐步构建类似 GPT 的语言模型。在这个项目中&#xff…

Linux 文件描述符

1、文件描述符 程序和进程的区别&#xff1a; 1、test.c&#xff1a;是一个程序&#xff0c;只占用磁盘空间&#xff0c;不占用内存空间 2、可执行文件 test&#xff1a;是一个程序&#xff0c;只占用磁盘空间&#xff0c;不占用内存空间 3、启动 可执行文件 test&#xff…

强固型工业电脑在码头智能化,龙门吊/流机车载电脑的行业应用

码头智能化行业应用 对码头运营来说&#xff0c;如何优化集装箱从船上到码头堆场到出厂区的各个流程以及达到提高效率。 降低成本的目的&#xff0c;是码头营运获利最重要的议题。为了让集装箱码头客户能够安心使用TOS系统来调度指挥码头上各种吊车、叉车、拖车和人员&#xf…

第一届 _帕鲁杯_ - CTF挑战赛

Mis 签到 题目附件&#xff1a; 27880 30693 25915 21892 38450 23454 39564 23460 21457 36865 112 108 98 99 116 102 33719 21462 21069 27573 102 108 97 103 20851 27880 79 110 101 45 70 111 120 23433 20840 22242 38431 22238 22797 112 108 98 99 116 102 33719 2…

matplotlib从起点出发(15)_Tutorial_15_blitting

0 位图传输技术与快速渲染 Blitting&#xff0c;即位图传输、块传输技术是栅格图形化中的标准技术。在Matplotlib的上下文中&#xff0c;该技术可用于&#xff08;大幅度&#xff09;提高交互式图形的性能。例如&#xff0c;动画和小部件模块在内部使用位图传输。在这里&#…

揭开ChatGPT面纱(3):使用OpenAI进行文本情感分析(embeddings接口)

文章目录 一、embeddings接口解析二、代码实现1.数据集dataset.csv2.代码3.运行结果 openai版本1.6.1 本系列博客源码仓库&#xff1a;gitlab&#xff0c;本博客对应文件夹03 在这一篇博客中我将使用OpenAI的embeddings接口判断21条服装评价是否是好评。 首先来看实现思路&am…

Llama3新一代 Llama模型

最近&#xff0c;Meta 发布了 Llama3 模型&#xff0c;从发布的数据来看&#xff0c;性能已经超越了 Gemini 1.5 和 Claud 3。 Llama 官网说&#xff0c;他们未来是要支持多语言和多模态的&#xff0c;希望那天赶紧到来。 未来 Llama3还将推出一个 400B大模型&#xff0c;目前…

计算机网络——数据链路层(介质访问控制)

计算机网络——数据链路层&#xff08;介质访问控制&#xff09; 介质访问控制静态划分信道动态划分信道ALOHA协议纯ALOHA&#xff08;Pure ALOHA&#xff09;原理特点 分槽ALOHA&#xff08;Slotted ALOHA&#xff09;原理特点 CSMA协议工作流程特点 CSMA-CD 协议工作原理主要…

JVM虚拟机(十二)ParallelGC、CMS、G1垃圾收集器的 GC 日志解析

目录 一、如何开启 GC 日志&#xff1f;二、GC 日志分析2.1 PSPO 日志分析2.2 ParNewCMS 日志分析2.3 G1 日志分析 三、GC 发生的原因3.1 Allocation Failure&#xff1a;新生代空间不足&#xff0c;触发 Minor GC3.2 Metadata GC Threshold&#xff1a;元数据&#xff08;方法…

【数据结构|C语言版】算法效率和复杂度分析

前言1. 算法效率2. 大O的渐进表示法3. 时间复杂度3.1 时间复杂度概念3.2 时间复杂度计算举例 4. 空间复杂度4.1 空间复杂度的概念4.2 空间复杂度计算举例 5. 常见复杂度对比结语 ↓ 个人主页&#xff1a;C_GUIQU 个人专栏&#xff1a;【数据结构&#xff08;C语言版&#xff09…

Kafka源码分析(四) - Server端-请求处理框架

系列文章目录 Kafka源码分析-目录 一. 总体结构 先给一张概览图&#xff1a; 服务端请求处理过程涉及到两个模块&#xff1a;kafka.network和kafka.server。 1.1 kafka.network 该包是kafka底层模块&#xff0c;提供了服务端NIO通信能力基础。 有4个核心类&#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第三方包安装版本不一致或缺少依赖包&…

Flink窗口机制

1.窗口的概念 时间是为窗口服务的。窗口是什么&#xff1f;为什么会有窗口呢&#xff1f; &#xff08;1&#xff09;Flink要处理的数据&#xff0c;一般是从Kafka过来的流式数据&#xff0c;如果只是单纯地统计流的数据量&#xff0c;是没办法统计的。 &#xff08;2&#xff…

C语言程序设计:简易版的printf函数实现

简易版的printf函数实现 功能说明 &#xff08;1&#xff09;使用putchar函数、va可变参完成printf函数基本功能的实现&#xff1b; &#xff08;2&#xff09;函数说明&#xff1a; 实现对下列数据类型的输出&#xff0c;并返回成功输出打印的字符个数&#xff1a; 整数&…

在CSDN创作了6个月,我收获了什么?文末送书~

作者主页&#xff1a;阿玥的小东东主页&#xff01; 正在学习&#xff1a;python和C/C 期待大家的关注哦 目录 一次很好的机会&#xff0c;让我开始了CSDN之旅 首先来看看我的几位领路人 创作动力 1W粉丝 在CSDN我收获了什么&#xff1f; 很高的展现量 认证创作者身份 社…

【Linux】系统安全及应用

目录 一、账号安全基本措施 1.系统账号清理 2.密码安全控制 3.历史命令安全管理 4.限制su切换用户 1&#xff09;将信任的用户加入到wheel组中 2&#xff09;修改su的PAM认证配置文件 5.ssh远程登录输入三次密码错误则锁定用户 二、Linux中的PAM安全认证 1.su命令的…

Redis入门到通关之数据结构解析-动态字符串SDS

文章目录 Redis数据结构-动态字符串动态扩容举例二进制安全SDS优点与C语言中的字符串的区别 Redis数据结构-动态字符串 我们都知道 Redis 中保存的Key是字符串&#xff0c;value 往往是字符串或者字符串的集合。可见字符串是 Redis 中最常用的一种数据结构。 不过 Redis 没有…

Android Studio超级详细讲解下载、安装配置教程(建议收藏)

博主介绍&#xff1a;✌专注于前后端、机器学习、人工智能应用领域开发的优质创作者、秉着互联网精神开源贡献精神&#xff0c;答疑解惑、坚持优质作品共享。本人是掘金/腾讯云/阿里云等平台优质作者、擅长前后端项目开发和毕业项目实战&#xff0c;深受全网粉丝喜爱与支持✌有…

贪吃蛇游戏实现(VS编译环境)

贪吃蛇游戏 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;C语言&#x1f353; &#x1f33c;文章目录&#x1f33c; 0. 前言 1. 游戏背景 2. 实现后游戏画面展示 3. 技术要求 4. Win32 API介绍 4.1 Win32 API 4.2 控制台程序 4.…

Java之类和对象

一面向对象的初步认知 1.什么是面向对象 Java是一门纯面向对象的语言(Object Oriented Program&#xff0c;简称OOP)&#xff0c;在面向对象的世界里&#xff0c;一切皆为对象。面向对象是解决问题的一种思想&#xff0c;主要依靠对象之间的交互完成一件事情。用面向对象的思想…