- 插入排序的概念介绍
- 原理分析与时间复杂度说明
- 两个示例代码:
- 基础演示版 —— 帮助理解插入排序的原理
- 业务逻辑场景版 —— 演示如何在实际场景中使用插入排序
一、什么是插入排序
**插入排序(Insertion Sort)**是一个在我们日常生活中非常常见的排序思路:就像打扑克牌一样,我们拿到新牌后,要把它插入到已有“排好”的牌组里,使得整个牌组依旧保持有序。
基本思路如下:
- 从第二个元素开始,认为第一个元素已经是排好序的。
- 将当前元素与前面已经排好序的元素依次进行比较,若发现它更小,就将这些元素向后“挪动”一格,给当前元素腾位置;
- 找到合适的位置后,将当前元素插入。
- 重复以上步骤,直到所有元素都被插入到正确位置。
当序列已经接近有序时,插入排序效率非常高;但如果序列是反向有序的,那么它需要大量移动操作。
二、原理简析
- 外层循环:从
i = 1
到n-1
(假设下标从 0 开始),每次都要把第 i 个元素“插”到前面已经排好序的[0..i-1]
区间里。 - 内层比较:从
i-1
开始,依次往前比较,如果发现arr[j] > arr[j+1]
,就把arr[j]
向后挪arr[j+1] = arr[j]
,然后继续比较更前面的元素,直到找出合适的位置,把当前元素插入。 - 实时插入:在这个过程中,需要临时保存当前要插入的元素,否则会被覆盖。
举个简单例子:
- 初始序列:
[5, 2, 9, 1, 7]
- 第 1 步(i=1,要插入的元素是 2)
- 与索引 0 处的元素 5 比较,2 < 5,所以把 5 往后挪,序列临时变为
[5, 5, 9, 1, 7]
- 与索引 0 处的元素 5 比较,2 < 5,所以把 5 往后挪,序列临时变为