插入排序
核心思路
统一视角:分治策略
- 分:将数组划分为已排序部分和未排序部分;
- 治:遍历未排序部分,解决单元素归位问题,增大已排序区间;
或者,更具体点:
- 分:划分固定比例 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,空集
实现
性质
- 稳定性?
- 原地性?
- 自适应性?
- 在线性?