《算法导论》中你必须理解的伪代码——0

222 阅读2分钟

preface: 《算法导论》是计算机科学丛书中占据举足轻重地位的重要参考书。 我将使用cpp等代码语言来实现其中的重要伪代码,附带详细注释

第2章 算法基础

本部分主要讨论了排序算法(插入排序+归并排序),介绍了分析算法的知识(包含Θ\Theta记号),证明并分析了两种排序算法。

代码实现

插入排序

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);
    }
}