插入排序
核心思路
统一视角:分治策略
- 分:将数组划分为已排序部分和未排序部分;
- 治:遍历未排序部分,解决单元素归位问题,增大已排序区间;
或者,更具体点:
- 分:划分固定比例 1 : (n-1),即 [已排序 | 未排序];
- 治:先解决单元素归位问题,再扩大已排序区间;
- 性能:由于划分始终是线性 1 : n-1,路径深度为 n,故复杂度为 O(n^2);
核心逻辑:
- 分:将数组划分为已排序部分和未排序部分;
- 治:遍历未排序部分,将未排序部分的首元素插入到已排序部分的正确位置
状态变化追踪
初始
- 已排序部分:[0, 0]
- 未排序部分:[1, n-1]
第1轮(i=1)
操作:遍历未排序部分[1, n-1],将未排序部分的首元素插入到已排序部分的正确位置
结果
- 已排序部分:[0, 1]
- 未排序部分:[2, n-1]
第2轮(i=2)
操作:遍历未排序部分[2, n-1],将未排序部分的首元素插入到已排序部分的正确位置
结果
- 已排序部分:[0, 2]
- 未排序部分:[3, n-1]
第k轮(i=k)
操作:遍历未排序部分[k, n-1],将未排序部分的首元素插入到已排序部分的正确位置
结果
- 已排序部分:[0, k]
- 未排序部分:[k+1, n-1]
第n-1轮(i=n-1)
操作:遍历未排序部分[n-1, n-1],将未排序部分的首元素插入到已排序部分的正确位置
结果
- 已排序部分:[0, n-1]
- 未排序部分:[n, n-1],空集
算法结束后
结果
- 已排序区间:[0, n-1]
- 未排序区间:[n, n-1],空集
实现
性质
- 稳定性?
- 原地性?
- 自适应性?
- 在线性?