插入排序是一种简单直观的排序算法,尤其在数据量较小或部分有序的情况下表现良好。本文将深入介绍插入排序的原理、实现、执行过程、复杂度分析以及适用场景。
📌一、算法思想
核心思想:
类似"抓扑克牌"的排序方式:每次从无序部分拿一张牌,插入到有序部分的合适位置。
步骤如下:
-
从第 2 个元素开始,向前扫描已排序部分;
-
找到第一个不大于当前元素的位置;
-
插入到该位置,后面元素依次后移。
🧪二、Python实现代码
插入排序代码如下:
python
def insert_sort(arr):
for i in range(1, len(arr)):
key = arr[i] # 当前待插入元素
j = i - 1
# 将所有比 key 大的元素向后移动
while j >= 0 and key < arr[j]:
arr[j + 1] = arr[j]
j -= 1
# 插入到正确位置
arr[j + 1] = key
return arr
# 示例
arr = [8, 4, 1, 6, 3]
print('insert_sorted:', insert_sort(arr))
🔍三、图示过程分析
以 arr = [8, 4, 1]
为例:
-
第1轮:4 < 8 → 插入前面 →
[4, 8, 1]
-
第2轮:1 < 8,1 < 4 → 插入最前面 →
[1, 4, 8]
⏱️四、时间复杂度分析
情况 | 比较次数 | 时间复杂度 |
---|---|---|
最好:完全有序 | 每轮最多 1 次 | O(n) |
最坏:完全逆序 | 类似冒泡 | O(n²) |
平均情况 | - | O(n²) |
-
空间复杂度:O(1),原地排序;
-
稳定性:稳定排序算法(不会打乱相等元素顺序);
🎯五、插入排序适用场景
适用情况 | 原因 |
---|---|
数据量较小 | 常数因子小 |
部分有序 | 时间复杂度接近 O(n) |
要求稳定排序 | 插入排序稳定 |
🧠六、总结
插入排序虽然在大数据量下效率不高,但其思想简洁,适合教学与面试中快速实现。实际应用中,如果能检测出部分有序或预排序数据,插入排序可以发挥优势。