《算法零基础》插入排序(概念篇)
一、引言
插入排序(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),所以优化的也只是常数时间,最坏时间复杂度是不变的。
「改进思路」执行插入操作之前利用 「 二分查找 」 来找到需要插入的位置。