热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

c语言插入排序_插入排序

1.工作原理“插入排序”算法,它与生活中的“扑克牌”紧密相关。相信玩过扑克牌的读者应该非常清楚,每次我们仅考虑一个数据(张牌),并将其插入
1. 工作原理“插入排序”算法,它与生活中的“扑克牌”紧密相关。相信玩过扑克牌的读者应该非常清楚,每次我们仅考虑一个数据(张牌),并将其插入到已排好序的扑克适当位置中。在插入该数据(扑克牌)时候,先将较大的元素一个个移到右边。我们将所有数据分为两个部分:已排序部分与未排序部分。

22bfe3c084c823ec1112c06ca1091006.png

▲图片来自HappyCoders.通俗说:“插入排序的工作原理是将未排序数组中的元素插入到已排序数组的子数组中,每次一项。”假如有一个数组arr, 其中各元素位置以及值如下:200,  45,  3,  65,  3,  67,  120则使用“插入排序”算法对该数组元素进行升序排序时候,其过程如下:(1) 将数组arr分为左侧的“已排序部分”和“右侧的未排序部分”。已排序的部分已经包含了开头的第一个元素,因为具有单个元素的数组总是可以认为是已排序的。

abcf99f49b96477d2a4821546365cc56.png

(2)检查“未排序部分”区域的第一个元素(此处是45)&#xff0c;将它与紧邻的“已排序”的左侧区域进行一一比较&#xff0c;以确定其在“已排序”区域的插入位置。此处45<200&#xff0c;因此需要将45移动到200位置的前面。

18ccda9b1895e9be992269c17bb87862.png

(3) 继续来看“未排序”区域的第一个元素(此处是3)。将它分别一一与“已排序”区域的元素进行比较。发现&#xff0c;3比左侧“已排序”区域的45、200都小。因此该元素(3)需放在45的前面&#xff0c;我们将45、200分别向后移动一个位置。流一个空间给3(编码中&#xff0c;根据索引,即数组下标直接交换元素就行&#xff0c;不需要移动数组元素)。

63c1efc719ff978be4b6568f2ee7b9ac.png

(4) 继续来看“未排序”区域的第一个元素(此处是65)。将它分别一一与“已排序”区域的元素进行比较。发现&#xff0c;65比3大, 比200小。因此插入的位置是在45与200之间。分别将45、200向后移动一个位置空间&#xff0c;将之前45的空间位置用于存储65。

c8c4b861023915f4894f549273e88011.png

依次类推&#xff0c;直到“未排序”区域元素所有元素均被一一与“已排序”区域元素比较。最终结果如下&#xff1a;

ff0d678f393a7e19121b66b60fb2c5b1.png

2. 实现C语言实现:

void InsertionSort(int *arr, int len){ assert(arr); int i &#61; 0, j &#61; 0, key &#61; 0; for(i &#61; 1; i 0 && arr[j-1] > arr[j]){ key &#61; arr[j]; arr[j] &#61; arr[j-1]; arr[j-1] &#61; key; j--; } } }3. 时间复杂度

     插入排序算法的在最理想情况下&#xff0c;复杂度是&#xff1a;O(n)&#xff1b;最极端情况下是&#xff1a;O(n^2. 即n的平方)。

理想情况下:
     插入排序执行两种操作:扫描列表&#xff0c;比较每对元素&#xff0c;如果元素顺序不对&#xff0c;则交换元素。每一次操作都会影响算法的运行时间。如果输入数组已经排好序&#xff0c;插入排序将比较O(N)个元素&#xff0c;并且不执行交换。因此&#xff0c;在最好的情况下&#xff0c;插入排序运行时间为O(N)。

     极端情况下:     当待排序的所有元素是降序排列时&#xff0c;是最为极端情况。要插入最后一个元素&#xff0c;我们最多需要ñ-1个 比较和最多 ñ-1个交换。要插入倒数第二个元素&#xff0c;我们最多需要ñ-2 比较和最多 ñ-2交换等等。因此&#xff0c;执行插入排序所需的操作数为&#xff1a;2×(1&#43;2&#43;⋯&#43;n−2&#43;n−1)。它遵循以下规则&#xff1a;

45e7234402e07cdfbc8be0d858031ff8.png因此平均情况与最坏情况具有相同的时间复杂性&#xff0c;即O(n^2. 即n的平方)。4. 空间复杂度

     插入排序是一种稳定的排序&#xff0c;其空间复杂度为O(1)。所谓“空间复杂度(Space complexity)” &#xff0c;它是处理算法分析时使用的一个术语。它是一个表达式&#xff0c;描述执行算法预期要解决的任务所需的内存量(空间)。例如&#xff0c;插入排序的空间复杂度为O(1)&#xff0c;因为它不需要额外的内存分配来对所提供的集合进行排序。

48ef91743fd93d2dff86c74173cd41b0.png




推荐阅读
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 本文介绍了解决Facebook脸书面试题中插入区间的方法,通过模拟遍历的方式判断当前元素与要插入元素的关系,找到插入点并将新区间插入。同时对算法的时间复杂度和空间复杂度进行了分析。 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • ALTERTABLE通过更改、添加、除去列和约束,或者通过启用或禁用约束和触发器来更改表的定义。语法ALTERTABLEtable{[ALTERCOLUMNcolu ... [详细]
  • 本文介绍了iOS数据库Sqlite的SQL语句分类和常见约束关键字。SQL语句分为DDL、DML和DQL三种类型,其中DDL语句用于定义、删除和修改数据表,关键字包括create、drop和alter。常见约束关键字包括if not exists、if exists、primary key、autoincrement、not null和default。此外,还介绍了常见的数据库数据类型,包括integer、text和real。 ... [详细]
  • Python SQLAlchemy库的使用方法详解
    本文详细介绍了Python中使用SQLAlchemy库的方法。首先对SQLAlchemy进行了简介,包括其定义、适用的数据库类型等。然后讨论了SQLAlchemy提供的两种主要使用模式,即SQL表达式语言和ORM。针对不同的需求,给出了选择哪种模式的建议。最后,介绍了连接数据库的方法,包括创建SQLAlchemy引擎和执行SQL语句的接口。 ... [详细]
  • C语言判断正整数能否被整除的程序
    本文介绍了使用C语言编写的判断正整数能否被整除的程序,包括输入一个三位正整数,判断是否能被3整除且至少包含数字3的方法。同时还介绍了使用qsort函数进行快速排序的算法。 ... [详细]
  • 合并列值-合并为一列问题需求:createtabletab(Aint,Bint,Cint)inserttabselect1,2,3unionallsel ... [详细]
  • 本文介绍了在使用Laravel和sqlsrv连接到SQL Server 2016时,如何在插入查询中使用输出子句,并返回所需的值。同时讨论了使用CreatedOn字段返回最近创建的行的解决方法以及使用Eloquent模型创建后,值正确插入数据库但没有返回uniqueidentifier字段的问题。最后给出了一个示例代码。 ... [详细]
author-avatar
吕小布
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有