算法导论(第3版)

第一部分 基础知识

第2章 算法基础

2.1 插入排序

伪代码:

INSERTION-SORT(A)
1 for j = 2 to A.length
2     key = A[j]
3     // Insert A[j] into the sorted sequence A[1..j -1].
4     i = j - 1
5     while i > 0 and A[i] > key
6         A[i + 1] = A[i]
7         i = i - 1
8     A[i + 1] - key

循环不变式: 在for 循环的每次迭代的开始,包含元素A[1…j - 1]的子数组构成了当前排序号的左手中的牌,剩余的子数组A[j + 1… n]对应于仍在桌子上的牌堆。事实上,元素A[1… j - 1]就是原来在位置1 到 j - 1 的元素,但现在已按序排序。我们把A[1…j - 1]的这些性质形式地表示为一个循环不变式。

循环不变式的3条性质:
1)初始化:循环的第一次迭代之前,它为真;
2)保持:如果循环的某次迭代之前它为真,那么下次迭代之前它仍为真;
3)终止:在循环终止时,符合不变式的定义。

循环不变式可以证明插入排序的正确性。

升序排列(从低到高)实例:

#include <iostream>

// 定义一个模板函数,用于通用的比较操作
template <typename T>
void insertionSort(T arr[], int n) {
    for (int j = 1; j < n; ++j) {
        T key = arr[j];
        int i = j - 1;

        // 将大于key的元素逐步后移
        while (i >= 0 && arr[i] > key) {
            arr[i + 1] = arr[i];
            i = i - 1;
        }
        arr[i + 1] = key;  // 插入键值到正确位置
    }
}

// 测试函数,这里假设arr是一个整数数组
int main() {
    int numbers[] = {9, 5, 7, 1, 8, 6};
    int size = sizeof(numbers) / sizeof(numbers[0]);

    std::cout << "Original array: ";
    for (int num : numbers) {
        std::cout << num << " ";
    }

    insertionSort(numbers, size);

    std::cout << "\nSorted array: ";
    for (int num : numbers) {
        std::cout << num << " ";
    }

    return 0;
}

C++在线编程网站,wandbox 运行结果:
在这里插入图片描述
降序排列(从高到低)实例:

#include <iostream>

template <typename T>
void insertionSort(T arr[], int n) {
    for (int i = 1; i < n; ++i) {
        T key = arr[i];
        int j = i - 1;
        while (j >= 0 && arr[j] > key) {
            arr[j + 1] = arr[j];
            j--;
        }
        arr[j + 1] = key;
    }
}

template <typename T>
void descendingInsertionSort(T arr[], int n) {
    for (int i = 1; i < n; ++i) {
        T key = arr[i];
        int j = i - 1;
        while (j >= 0 && arr[j] < key) { // 修改这里,使用小于号 `<`
            arr[j + 1] = arr[j];
            j--;
        }
        arr[j + 1] = key;
    }
}

int main() {
    int numbers[] = {5, 2, 9, 1, 7};
    double doubles[] = {4.8, 1.3, 6.7, 2.1, 8.5};

    insertionSort(numbers, sizeof(numbers) / sizeof(numbers[0]));
    descendingInsertionSort(doubles, sizeof(doubles) / sizeof(doubles[0]));

    std::cout << "Sorted integers in ascending order: ";
    for (const auto& num : numbers)
        std::cout << num << " ";
    std::cout << "\nSorted doubles in descending order: ";
    for (const auto& num : doubles)
        std::cout << num << " ";

    return 0;
}

C++在线编程网站,wandbox 运行结果:在这里插入图片描述

第二部分 排序和顺序统计量

第三部分 数据结构

第四部分 高级设计和分析技术

第五部分 高级数据结构

第六部分 图算法

第七部分 算法问题选编

第八部分 附录:数学基础知识

算法导论 第3》是一本经典的计算机科学教材,由Thomas H.Cormen、Charles E.Leiserson、Ronald L.Rivest和Clifford Stein合著,主要介绍了算法设计与分析的基本原理和技巧。 这本教材分为六个部分,共29章。第一部分概述了算法设计与分析的基本概念和方法。第二部分介绍了基本的排序和选择算法,包括插入排序、归并排序、堆排序等。第三部分讨论了数据结构,包括栈、队列、二叉树等,以及各种基本数据结构的实现和应用。第四部分重点介绍了动态规划算法和贪心算法,涵盖了最长公共子序列、最优二叉查找树等问题。第五部分深入讲解了图算法,包括最短路径、最小生成树等。第六部分介绍了一些高级主题,如NP完全性以及近似算法。 每一章都包含了大量的例子和习题,这些习题有助于读者巩固知识,并提供了解决实际问题的思路。此外,书中还有丰富的附录和参考资料,供读者进一步学习和探索。 《算法导论 第3》有着简洁明了的表达和深度而完整的内容,适合作为大学本科生和研究生学习计算机科学基础的教材。无论是作为算法入门的起点,还是作为算法设计与分析的参考书,都具有很高的价值。 总之,《算法导论 第3》是一本经典权威的算法教材,涵盖了算法设计与分析的基础知识和方法,并提供了大量的例子和习题,对计算机科学相关专业的学生和从业者来说,是一本不可多得的学习资料。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值