Day06 插入排序(概念篇)

153 阅读3分钟

《算法零基础》插入排序(概念篇)

一、引言

​ 插入排序(Insertion Sort)是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入,直到整个数组有序。

二、算法思想

​ 第一步:从第一个元素开始,将其视为已排序部分。

​ 第二步:取出下一个元素,与已排序部分的元素进行比较。

​ 第三步:如果该元素小于已排序部分的最后一个元素,则将其插入到已排序部分的适当位置。

​ 重复步骤 二 和 三,直到整个数组都被排序。

三、动图演示

  我们看到,首先需要将 「第二个元素」 和 「第一个元素」 进行 「比较」,如果 前者 小于等于 后者,则将 后者 进行向后 「移动」,前者 则执行插入;

  然后,进行第二轮「比较」,即 「第三个元素」 和 「第二个元素」、「第一个元素」 进行 「比较」, 直到 「前三个元素」 保持有序 。

  最后,经过一定轮次的「比较」 和 「移动」之后,一定可以保证所有元素都是 「升序」 排列的。

四、算法分析

1、时间复杂度

​ 我们假设 「比较」 和 「移动」 的时间复杂度为 O(1) 的。

​ 「 插入排序 」 中有两个嵌套循环。

​ 外循环正好运行 n−1 次迭代。 但内部循环运行变得越来越短:

  当 i = 1,内层循环 1 次「比较」操作。

  当 i = 2,内层循环 2 次「比较」操作。

  当 i = 3,内层循环 3 次「比较」操作。

  ……

  当 i = n − 2,内层循环 n − 2 次「比较」操作。

  当 i = n − 1,内层循环 n − 1 次「比较」操作。

​ 因此,总「比较」次数如下:1 + 2 + . . . + ( n − 1 ) = n(n-1)/2。总的时间复杂度为:O (n^2)。

2、空间复杂度

​ 由于算法在执行过程中,只有「移动」变量时候,需要事先将变量存入临时变量x,而其它没有采用任何的额外空间,所以空间复杂度为 O(1)。

五、算法的优点

​ 1. 简单易懂,易于实现。

​ 2. 适用于小型数组或基本有序的数组。

​ 3. 稳定性好,不会改变相等元素的相对顺序。

六、算法的缺点

​ 1. 对于大型无序数组,效率较低。

​ 2. 不适合大规模数据排序。

七、优化方案

  「 插入排序 」在众多排序算法中效率较低,时间复杂度为 O(n^2)。

  考虑,在进行插入操作之前,我们找位置的过程是在有序数组中找的,所以可以利用「二分查找」 来找到对应的位置。然而,执行 「 插入 」 的过程还是 O (n),所以优化的也只是常数时间,最坏时间复杂度是不变的。

​ 「改进思路」执行插入操作之前利用 「 二分查找 」 来找到需要插入的位置。