typedef int ElementType;
void InsertionSort (ElementType* A, int N) {
int j, P;
ElementType Tmp;
for (P = 1; P < N; ++P) {
Tmp = A[P]; // P 索引位置上的值,可能会被覆盖,所以对该值进行提前保存
for (j = P; j > 0 && A[j-1] > Tmp; --j) {
A[j] = A[j-1];
}
A[j] = Tmp;
}
}
1. 插入排序的分析
数组中的 inversion 是指数组中具有性质 [34, 8, 64, 51, 32, 21]
便存在如下序偶:
- (34, 8), (34, 32), (34, 21);
- (64, 51), (64, 32), (64, 21);
- (51, 32), (51, 21);
- (32, 21);
共 9 个inversion,而这也是由插入排序(非直接)执行的交换次数。情况恰好就是这样,交换两个不按原序排列的相邻元素恰好消除一个 inversion。
因此插入排序的精确时间复杂度为: