preface: 《算法导论》是计算机科学丛书中占据举足轻重地位的重要参考书。 我将使用cpp等代码语言来实现其中的重要伪代码,附带详细注释
第2章 算法基础
本部分主要讨论了排序算法(插入排序+归并排序),介绍了分析算法的知识(包含记号),证明并分析了两种排序算法。
代码实现
插入排序
void insertSort(int a[], int len)
{
for (int j = 1; j < len; j++)
{
int key = a[j]; // key是本代码关键, key之前的元素已经排好序,关键是将key插入有序序列
int i = j - 1;
for (; i >= 0; i--)
{
if (a[i] > key)
{
a[i + 1] = a[i];
}
else
{
break;
}
}
a[i + 1] = key;
}
}
归并排序
特别注意,这边merge函数部分的两个有序序列的索引确定严格依赖于mergeSort部分的分治过程, 需要根据分治所选择的索引来确定merge部分的索引p,q,r
// a是待排序数组, p索引前的元素已经有序, [p, q]的元素有序, [q + 1, r]的元素有序, 将两个有序序列归并。
void merge(int a[], int p, int q, int r)
{
// 先拷贝进入临时数组
int tmp1[q - p + 1] = {0};
int tmp2[r - q] = {0};
for (int i = 0; i <= q - p; i++)
{
tmp1[i] = a[p + i];
}
for (int i = 0; i <= r - q; i++)
{
tmp2[i] = a[q + 1 + i];
}
// 正式归并
int i = 0, j = 0;
while (i <= q - p && j < r - q)
{
if (tmp1[i] <= tmp2[j])
{
a[p + i + j] = tmp1[i];
i++;
}
else
{
a[p + i + j] = tmp2[j];
j++;
}
}
while (i <= q - p)
{
a[p + i + j] = tmp1[i];
i++;
}
while (j < r - q)
{
a[p + i + j] = tmp2[j];
j++;
}
}
void mergeSort(int a[], int p, int r)
{
// 如果p>=r, 没有归并的必要
if (p < r)
{
int q = (p + r) / 2;
mergeSort(a, p, q); // 保证[p, q]有序
mergeSort(a, q + 1, r); // 保证[q + 1, r]有序
merge(a, p, q, r);
}
}