热门标签 | 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




推荐阅读
  • 优化后的标题:Apache Cassandra数据写入操作详解
    本文详细解析了 Apache Cassandra 中的数据写入操作,重点介绍了 INSERT 命令的使用方法。该命令主要用于将数据插入到指定表的列中,其基本语法为 `INSERT INTO 表名 (列1, 列2, ...) VALUES (值1, 值2, ...)`。通过具体的示例和应用场景,文章深入探讨了如何高效地执行数据写入操作,以提升系统的性能和可靠性。 ... [详细]
  • 如何在Java中使用DButils类
    这期内容当中小编将会给大家带来有关如何在Java中使用DButils类,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。D ... [详细]
  • 三角测量计算三维坐标的代码_双目三维重建——层次化重建思考
    双目三维重建——层次化重建思考FesianXu2020.7.22atANTFINANCIALintern前言本文是笔者阅读[1]第10章内容的笔记,本文从宏观的角度阐 ... [详细]
  • 利用python爬取豆瓣电影Top250的相关信息,包括电影详情链接,图片链接,影片中文名,影片外国名,评分,评价数,概况,导演,主演,年份,地区,类别这12项内容,然后将爬取的信息写入Exce ... [详细]
  • Ihavetwomethodsofgeneratingmdistinctrandomnumbersintherange[0..n-1]我有两种方法在范围[0.n-1]中生 ... [详细]
  • 本文介绍如何使用 Python 的 DOM 和 SAX 方法解析 XML 文件,并通过示例展示了如何动态创建数据库表和处理大量数据的实时插入。 ... [详细]
  • 字节流(InputStream和OutputStream),字节流读写文件,字节流的缓冲区,字节缓冲流
    字节流抽象类InputStream和OutputStream是字节流的顶级父类所有的字节输入流都继承自InputStream,所有的输出流都继承子OutputStreamInput ... [详细]
  • 本文详细介绍了 PHP 中对象的生命周期、内存管理和魔术方法的使用,包括对象的自动销毁、析构函数的作用以及各种魔术方法的具体应用场景。 ... [详细]
  • 本文总结了在SQL Server数据库中编写和优化存储过程的经验和技巧,旨在帮助数据库开发人员提升存储过程的性能和可维护性。 ... [详细]
  • php更新数据库字段的函数是,php更新数据库字段的函数是 ... [详细]
  • 本文详细介绍了MySQL数据库的基础语法与核心操作,涵盖从基础概念到具体应用的多个方面。首先,文章从基础知识入手,逐步深入到创建和修改数据表的操作。接着,详细讲解了如何进行数据的插入、更新与删除。在查询部分,不仅介绍了DISTINCT和LIMIT的使用方法,还探讨了排序、过滤和通配符的应用。此外,文章还涵盖了计算字段以及多种函数的使用,包括文本处理、日期和时间处理及数值处理等。通过这些内容,读者可以全面掌握MySQL数据库的核心操作技巧。 ... [详细]
  • 在什么情况下MySQL的可重复读隔离级别会导致幻读现象? ... [详细]
  • 在《Cocos2d-x学习笔记:基础概念解析与内存管理机制深入探讨》中,详细介绍了Cocos2d-x的基础概念,并深入分析了其内存管理机制。特别是针对Boost库引入的智能指针管理方法进行了详细的讲解,例如在处理鱼的运动过程中,可以通过编写自定义函数来动态计算角度变化,利用CallFunc回调机制实现高效的游戏逻辑控制。此外,文章还探讨了如何通过智能指针优化资源管理和避免内存泄漏,为开发者提供了实用的编程技巧和最佳实践。 ... [详细]
  • PTArchiver工作原理详解与应用分析
    PTArchiver工作原理及其应用分析本文详细解析了PTArchiver的工作机制,探讨了其在数据归档和管理中的应用。PTArchiver通过高效的压缩算法和灵活的存储策略,实现了对大规模数据的高效管理和长期保存。文章还介绍了其在企业级数据备份、历史数据迁移等场景中的实际应用案例,为用户提供了实用的操作建议和技术支持。 ... [详细]
  • 在使用 Cacti 进行监控时,发现已运行的转码机未产生流量,导致 Cacti 监控界面显示该转码机处于宕机状态。进一步检查 Cacti 日志,发现数据库中存在 SQL 查询失败的问题,错误代码为 145。此问题可能是由于数据库表损坏或索引失效所致,建议对相关表进行修复操作以恢复监控功能。 ... [详细]
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社区 版权所有