插入排序(Insertion Sort)是一种简单直观的排序算法。它的工作原理类似于我们手中整理扑克牌的过程:将一张牌插入到已经排好序的牌中的正确位置。插入排序通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。
插入排序在实现上,通常采用原地排序(即只需用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。
插入排序的基本思想:
以升序排列为例,插入排序的详细步骤:
假设有数组 [5, 2, 4, 6, 1, 3]:
for i in range(1, len(arr)) 从第二个元素开始处理key = arr[i] 保存要插入的元素j = i - 1 指向已排序部分的最后一个元素while j >= 0 and arr[j] > key 从后向前比较arr[j + 1] = arr[j] 将大于key的元素后移arr[j + 1] = key 将key插入到正确位置详细分析:
| 特性 | 插入排序 | 选择排序 | 冒泡排序 |
|---|---|---|---|
| 时间复杂度(最好) | O(n) | O(n²) | O(n) |
| 时间复杂度(最坏) | O(n²) | O(n²) | O(n²) |
| 时间复杂度(平均) | O(n²) | O(n²) | O(n²) |
| 空间复杂度 | O(1) | O(1) | O(1) |
| 稳定性 | 稳定 | 不稳定 | 稳定 |
| 自适应性 | 有 | 无 | 有 |
| 在线性 | 是 | 否 | 否 |
插入排序特别适用于:
插入排序虽然在大数据集上效率不高,但其简单性、稳定性和对小数据集的高效性使其在实际应用中仍有重要价值,特别是作为其他复杂排序算法的组成部分。