插入排序2024年8月29日 | 阅读 10 分钟 插入排序是一种基于比较的排序算法,它通过一次一个元素地构建最终的排序数组。它通过将输入数组划分为两个区域:已排序区域和未排序区域。最初,已排序区域只包含第一个元素,其余的数组被视为未排序。 算法逐一遍历未排序区域的每个元素,并将其与已排序区域中的元素进行比较。它通过将大于当前元素的元素向右移动来找到当前元素在已排序区域中的正确位置。这种移动为当前元素创建了一个插入空间。 为了执行插入,算法从已排序区域的最右边元素开始,并将其与当前元素进行比较。如果已排序区域中的元素更大,则将其向右移动一个位置。这个过程一直持续到找到当前元素的适当位置为止。 一旦确定了正确的位置,算法就会将当前元素插入到已排序区域。这个插入步骤会为未排序区域中的所有元素重复执行,逐渐扩展已排序区域,直到整个数组被排序。 插入排序是一种原地算法,意味着它不需要额外的内存来执行排序。它也被认为是一种稳定的排序算法,因为它保留了相等值元素的相对顺序。 在最坏的情况下,插入排序的时间复杂度为 O(n^2),其中 n 是输入数组中的元素数量。然而,在实践中,对于小型或部分排序的数组,它的性能可能会更好。在最好的情况下,当输入数组已经排序时,时间复杂度会降低到 O(n)。平均时间复杂度也为 O(n^2),与快速排序或归并排序等更高级的排序算法相比,效率较低。 尽管对于大型数组的性能相对较慢,但插入排序仍有一些优点。它易于理解和实现,使其成为小型数据集或偏好简单而非效率的情况下的合适选择。此外,它在部分排序或近乎排序的数组上表现良好,与其他算法相比,需要更少的比较和交换。 总之,插入排序是一种简单直观的排序算法,它通过将元素反复插入已排序区域中的正确位置来构建最终的排序数组。虽然对于大型数据集来说它可能不是最高效的选择,但它有其优点,在某些情况下可以成为一个有用的工具。 历史插入排序算法有着悠久的历史,可以追溯到计算机科学的早期。它最早由计算机科学家和数学家约翰·冯·诺依曼(John von Neumann)于1945年提及,尽管该算法可能在此之前就已经为人所知。 插入排序的基本概念可以在纸牌游戏中找到,例如扑克牌或桥牌。玩家通常通过不断将一张新牌插入到已排序的牌组中的正确位置来整理自己的牌。这种手动排序技术启发了插入排序算法的发展。 随着计算机的出现以及对高效排序方法的需求,该算法获得了推广。在计算机的早期,内存有限,复杂的排序算法并不可行。插入排序因其简单性和高效排序小型数组的能力而成为一个受欢迎的选择。 在计算机编程的背景下,最早提及插入排序算法的文献之一可以在莫里斯·威尔克斯(Maurice Wilkes)于1951年出版的书《电子数字计算机程序准备》(The Preparation of Programs for an Electronic Digital Computer)中找到。威尔克斯将该算法描述为一种在计算机程序中对数字列表进行排序的技术。 多年来,插入排序得到了广泛的分析和研究。其时间复杂度和性能特征已被充分理解。研究人员将插入排序与其他排序算法进行了比较,并确定了其优缺点。 虽然插入排序对于大型数据集来说可能不是最有效的算法,但它在各种场景中都有其应用。当处理小型或部分排序的数组时,它特别有用,因为其简单性和良好的性能使其成为一个有吸引力的选择。 尽管开发了更高级的排序算法,插入排序仍然作为一种重要的排序技术被教授和研究。其直接的实现和直观的性质使其成为学习排序算法和理解计算机科学基本原理的宝贵工具。 插入排序算法
下面是 C++ 插入排序算法的程序输出 5 6 11 12 13 ............ Process executed in 1.11 seconds Press any key to continue. 说明 以下是给定代码的分步解释
时间复杂度分析 此代码中实现的插入排序算法在最坏和平均情况下的时间复杂度为 O(n2),在最好情况下的时间复杂度为 O(n)。 主循环运行 O(n) 次迭代(其中 O(n) 是数组的大小),对于每次迭代,内部 while 循环最多可能运行 i 次,其中 i 是外层循环中的当前索引。在最坏的情况下,当数组是反向排序的时,内部循环将运行其最大次数,导致 O(n2) 的时间复杂度。在最好的情况下,当数组已经排序时,内部循环不会执行,时间复杂度为 O(n)。 空间复杂度分析 代码的空间复杂度为 O(1)。原因是该算法以原地方式执行排序,不使用任何额外的、其空间需求取决于输入大小的数据结构。唯一使用的额外空间是像 i、key 和 j 这样的变量,它们的大小是常数,与输入数组大小无关。 总之,在最坏和平均情况下,时间复杂度为 O(n2),在最好情况下为 O(n),而空间复杂度为 O(1),因为算法使用了恒定的额外空间。 插入排序的优点
插入排序的缺点
总之,虽然插入排序具有简单性、空间效率,并且在小型输入或部分排序的数组上表现良好,但其二次时间复杂度和缺乏适应性使其不适合大型数据集或已排序数组。在选择排序算法时,请考虑输入数据的特性和所需的性能要求。 插入排序的应用插入排序是一种简单而高效的排序算法,可应用于各种场景。以下是插入排序的一些常见应用:
总而言之,插入排序对于大规模或高度未排序的数据集来说可能不是最有效的排序算法。然而,它的简单性、对特定场景的适用性以及教育价值使其成为各种应用中的宝贵算法。 下一个主题Needleman-Wunsch 算法 |
什么是二叉树?二叉树是一种数据结构,由分层组织的节点组成。每个节点最多有两个子节点,通常是左子节点和右子节点。根节点是树中最顶端的节点,叶节点是...
阅读 16 分钟
在 C++ 中,std::string::crbegin() 和 std::string::crend() 是 std::string 类(已在 C++11 中添加)的成员函数。它们提供对字符串反向迭代器的访问,允许用户通过反向遍历字符串元素来迭代。在本文中,我们将讨论...
阅读 2 分钟
在本文中,我们将讨论其方法和实现。一种流行的用于对各种竞技游戏中的玩家进行排名的评分方法是 Elo 评分方法。ELO 评分高于另一位玩家的玩家更有可能获胜...
阅读 4 分钟
使用 C++ 中的 accumulate,我们可以高效地查找数组的总和 () 数组是一个线性数据结构,包含内存连续流中的相同数据类型元素。数组中所有元素的总和称为数组总和。C++ 中有几种方法……
阅读 3 分钟
我们都知道,学习 C/C++ 或任何其他编程语言的数据类型至关重要。因为我们在软件工程师的编码和职业生涯中始终使用它们。每种数据类型都将与特定的大小和内存相关联...
阅读 3 分钟
stoi 是一个 C++ 标准库函数,用于将字符串转换为整数。它代表“string to integer”。它接受一个字符串作为输入并返回相应的整数值。如果输入字符串无效,该函数可能会引发 std::invalid_argument 类型的异常...
阅读 2 分钟
在本文中,我们将讨论如何在 C++ 中找到最大乘积子数组。查找给定数组中正数和负数子数组的最大乘积。预计时间复杂度为 O(n),并且唯一可用的额外空间为 O(1)。示例:输入:arr[] =……
阅读 3 分钟
能够整除另一个数且不产生余数的数被称为因子。例如,20 的因子是 1、2、4、5、10 和 20。例如 1. 头文件包含 C++ 标准库的输入输出流函数...
阅读 3 分钟
引言:在各种算法和数据操作任务中,经常需要通过几次操作将某个索引处的元素减小到零。这项任务经常出现在竞争性编程、数值分析以及许多其他计算算法中。在本文中,我们...
阅读 8 分钟
它们在 C++ 的 strtoimax() 和 strtoumax() 函数的运行方式相同,不同之处在于它们用于将宽字符串 (wstring) 的数据转换为给定基数的整数。此函数定义在头文件 cinttypes 中。头文件...
阅读 3 分钟
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India