AlgoMooc

插入排序

20 / 28基础内容

数据结构动画

插入排序

加载中
正在加载动画引擎...

本课导读

插入排序就像摸牌:左手维护一副已排好的牌,每摸一张就把它插到正确的位置。

你将学到
  • 有序区 / 无序区的概念
  • 插入时比它大的元素先右移腾位
  • 数据近乎有序时快到 O(n)

插入排序在做什么(摸牌类比)

想象你在打牌,左手已经抓了一手排好序的牌,右手从桌上摸起一张新牌。你的任务是把这张新牌插入到左手牌中正确的位置,使得左手依然有序。这就是插入排序的核心思想:将数组视为两部分——左边是已排序区,右边是未排序区,每次从右边取第一个元素,插入到左边合适的位置。

一次插入的流程:右移腾位再放入

假设已排序区有若干元素,现在要插入一个新元素。流程是:

  • 先记住新元素的值;
  • 从已排序区的最后一个元素开始,依次与它比较,如果比它大,就把那个元素向右移动一位,腾出一个空位;
  • 直到找到第一个不大于它的元素,或者到达最左边,然后把新元素放入空位。
这个过程就像在牌堆里找位置,把比它大的牌都往后挪一格。

最好/最坏复杂度(为什么近乎有序时 O(n))

情况时间复杂度说明
最好(已有序)O(n)每次插入只需比较一次(新元素比已排序区最后一个大),无需移动,直接放在末尾。
最坏(逆序)O(n²)每次插入都要比较和移动所有已排序元素,总比较和移动次数约为 n²/2。
平均O(n²)随机顺序下,平均比较和移动次数约为 n²/4。

当数组近乎有序时,大部分元素只需少量比较和移动,因此复杂度接近 O(n)。这是插入排序的重要特性。

稳定性

稳定。插入排序在插入时,如果遇到相等元素,通常将新元素放在相等元素之后(即不越过相等元素),因此保持了相等元素的原始相对顺序。这对于需要稳定排序的场景很重要。

适用场景:小数组、近乎有序

插入排序适合小规模数据(如几十个元素),因为其常数因子小,实现简单。也特别适合近乎有序的数组,此时效率接近线性。许多高级排序(如快速排序)在递归到小数组时会切换到插入排序以提升性能。

吴师兄提示:近乎有序的数据,用插入排序最划算。

学完练一练

把刚学的结构放进 LeetCode 题里用一次。

去图解题库实战