1. 插入排序迭代版(非降序排序)
void insert_sort_iterative(int A[], int len)
{
if (A == NULL || len <= 1)
return;
for (int j = 1; j < len; ++j)
{
int key = A[j];
// insert A[j] into the sorted sequence A[0..j-1]
int i = j - 1;
// 注意是 i >= 0 而不是 i > 0
while (i >= 0 && A[i] > key)
{
A[i + 1] = A[i];
--i;
}
A[i + 1] = key;
}
return;
}
2. 插入排序递归版 (非降序排序)
在《算法导论》第3版的习题2.3-4中,把插入排序表示为如下的一个递归过程
- 为了排序A[0..n-1],我们递归地排序A[0..n-2]
- 然后把A[n-1]插入已排序的数组A[0..n-2]
void insert_sort(int A[], int len)
{
if (len > 1)
{
int key = A[len - 1];
int i = len - 2;
while (i >= 0 && A[i] > key)
{
A[i + 1] = A[i];
--i;
}
A[i + 1] = key;
}
}
void insert_sort_recursive(int A[], int len)
{
if (len > 1)
{
insert_sort_recursive(A, len - 1);
insert_sort(A, len);
}
}
3. 总结
最佳情况:输入数组已排好序,运行时间是n的线性函数
最坏情况:输入数组已反向排序,即按递减序排好序,运行时间是n的二次函数