算法导论(第3版)

news2025/1/9 2:16:42

目录

  • 第一部分 基础知识
    • 第2章 算法基础
      • 2.1 插入排序
  • 第二部分 排序和顺序统计量
  • 第三部分 数据结构
  • 第四部分 高级设计和分析技术
  • 第五部分 高级数据结构
  • 第六部分 图算法
  • 第七部分 算法问题选编
  • 第八部分 附录:数学基础知识

第一部分 基础知识

第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 运行结果:在这里插入图片描述

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

第三部分 数据结构

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

第五部分 高级数据结构

第六部分 图算法

第七部分 算法问题选编

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2143347.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【智路】智路OS 服务组件开发

https://airos-edge.readthedocs.io/zh/latest/dev_guide/service_dev.html 1 总览 1.1 功能 感知服务包含感知的整体pipeline&#xff0c;主要模块包括单相机感知和融合。 单相机感知模块 主要功能为接收IP相机RTSP视频流&#xff0c;解码成RGB图片&#xff0c;通过算法识…

【黑马点评】已解决java.lang.NullPointerException异常

Redis学习Day3——黑马点评项目工程开发-CSDN博客 问题发现及描述 在黑马点评项目中&#xff0c;进行到使用Redis提供的Stream消息队列优化异步秒杀问题时&#xff0c;我在进行jmeter测试时遇到了重大的错误 发现无论怎么测试&#xff0c;一定会进入到catch中&#xff0c;又由…

DRS部署(DM8-DM8)

DRS部署 一、规划端口二、设置环境变量三、开启源数据库的归档和逻辑日志四、配置DDL同步五、创建用户六、 DRS服务部署&#xff08;DM8目的端&#xff09;6.1 部署 drs 服务6.2启动drs服务 七、 DRS 服务部署&#xff08;DM8 源端&#xff09;7.1 部署 DRS服务7.2 启动dmhs服务…

C++第七节课 运算符重载

一、运算符重载 并不是所有情况下都需要运算符重载&#xff0c;要看这个运算符对这个类是否有意义&#xff01; 例如&#xff1a;日期减日期可以求得两个日期之间的天数&#xff1b;但是日期 日期没有意义&#xff01; #include<iostream> using namespace std; clas…

SpringBoot启动成功,但端口启动失败

目录 一、问题展示 二、问题分析 2.1.端口与Tomcat的关系 2.2.问题分析 三、SpringBoot常见知识记录 3.1.SpringBoot项目常用jar包 3.1.1.必要性jar包 3.1.2.选择性jar包 3.2.标签的作用及取值 3.2.1.compile&#xff08;编译范围&#xff09; 3.2.2.provided…

爵士编曲:爵士鼓编写 爵士鼓笔记 底鼓和军鼓 闭镲和开镲 嗵鼓

底鼓和军鼓 底鼓通常是动的音色&#xff0c;军鼓通常是大的音色。 “动”和“大”构成基础节奏。“动大”听着不够有连接性&#xff0c;所以可以加入镲片&#xff01; 开镲 直接鼓棒敲击是开镲音色 闭镲 当脚踩下踏板&#xff0c;2个镲片合并&#xff0c;然后用鼓棒敲击&am…

Koa安装和应用

文章目录 1、Koa21.1 简介1.2 安装1.3 简单使用1.4 使用脚手架创建Koa项目 1、Koa2 1.1 简介 Koa 是一个新的 web 框架&#xff0c;由 Express 幕后的原班人马打造&#xff0c; 致力于成为 web 应用和 API 开发领域中的一个更小、更富有表现力、更健壮的基石。 通过利用 async…

rust快速创建Tauri App ——基于create-tauri-app

Tauri App Tauri是一个工具包&#xff0c;可以帮助开发人员使用现有的几乎任何前端框架为主要桌面平台制作应用程序。核心是用Rust构建的&#xff0c;CLI利用Node.js使Tauri成为创建和维护优秀应用程序的真正多语言方法。 cargo install create-tauri-appcreate-tauri-app&am…

多版本node管理工具nvm

什么是nvm&#xff1f; 在项目开发过程中&#xff0c;使用到vue框架技术&#xff0c;需要安装node下载项目依赖&#xff0c;但经常会遇到node版本不匹配而导致无法正常下载&#xff0c;重新安装node却又很麻烦。为解决以上问题&#xff0c;nvm&#xff1a;一款node的版本管理工…

FSFP——专为蛋白质工程设计的少样本学习策略

论文地址&#xff1a;通过小样本学习&#xff0c;以最少的湿实验室数据提高蛋白质语言模型的效率 参考文献&#xff1a;AI蛋白质设计“新引擎”:FSFP驱动大模型超低采样学习,少量数据显著提升蛋白质语言模型的性能 前言介绍&#xff1a;上海交通大学自然科学研究院洪亮教授课…

在STM32工程中使用Mavlink与飞控通信

本文讲述如何在STM32工程中使用Mavlink协议与飞控通信&#xff0c;特别适合自制飞控外设模块的项目。 需求来源&#xff1a; 1、增稳云台里的STM32单片机需要通过串口接收飞控传来的云台俯仰、横滚控制指令和相机拍照控制指令&#xff1b; 2、自制的有害气体采集器需要接收飞…

PCL 曲线点云提取

文章目录 一、简介二、实现代码三、实现效果参考文献一、简介 提取曲线点云的方法主要分为两种:参数化与非参数化,其中参数化是指事先直线曲线的形状,反之,非参数化则是不依赖与曲线的参数,通常是一种聚类的行为。这里我们采用非参数方法(TriplClust),将点集划分为一个未…

Java ETL - Apache Beam 简介

基本介绍 Apache Beam是一个用于大数据处理的开源统一编程模型。它允许用户编写一次代码&#xff0c;然后在多个批处理和流处理引擎上运行&#xff0c;如Apache Flink、Apache Spark和Google Cloud Dataflow等。Apache Beam提供了一种简单且高效的方式来实现数据处理管道&…

上海儿童自闭症寄宿制学校,让孩子找到归属感

在探讨自闭症儿童教育的广阔图景中&#xff0c;上海作为一座充满人文关怀的城市&#xff0c;始终致力于为这些特殊的孩子提供更加全面、专业的支持体系。而当我们把这份关注与努力投射到具体实践上&#xff0c;广州的星贝育园自闭症儿童寄宿制学校便成为了这样一个温馨而有力的…

蓝桥杯DS18B20程序源码

蓝桥杯DS18B20程序源码解析 蓝桥杯&#xff0c;作为一项全国瞩目的电子设计竞赛&#xff0c;其核心挑战在于参赛者需深度融合单片机编程与各类电子元件的应用能力。在众多项目中&#xff0c;涉及DS18B20数字温度传感器的程序源码尤为引人注目&#xff0c;它巧妙地将单片机技术…

ollama安装(ubuntu20.04)

Ollama是一款开源的自然语言处理工具&#xff0c;它可以帮助开发者快速构建文本处理应用。 ollama官网: https://ollama.ai/ 一、ollama 自动安装 linux统一采用sh脚本安装&#xff0c;一个命令行搞定。 curl -fsSL https://ollama.com/install.sh | sh二、ollama 手动安装 o…

使用 OpenCV 和 Matplotlib:绘制其彩色直方图以及拓展

如何使用 OpenCV 和 Matplotlib 读取、处理并显示图像。即将为您解答&#xff1a; 绘制其彩色直方图 代码解释 读取图像并转换颜色空间&#xff1a; image cv2.imread(001.jpg) image_rgb cv2.cvtColor(image, cv2.COLOR_BGR2RGB)cv2.imread(001.jpg)&#xff1a;从文件中…

C#基于SkiaSharp实现印章管理(7)

印章中的文本主要分为两种&#xff1a;1&#xff09;从左向右水平绘制的文本&#xff1b;2&#xff09;沿指定路径绘制的文本。前者使用SKCanvas的DrawText绘制文本&#xff0c;后者则使用SKCanvas的DrawTextOnPath绘制文本。   针对上述情况&#xff0c;调整SealElement类型…

Python编码系列—Python代理模式:为对象赋予超能力的魔法

&#x1f31f;&#x1f31f; 欢迎来到我的技术小筑&#xff0c;一个专为技术探索者打造的交流空间。在这里&#xff0c;我们不仅分享代码的智慧&#xff0c;还探讨技术的深度与广度。无论您是资深开发者还是技术新手&#xff0c;这里都有一片属于您的天空。让我们在知识的海洋中…

【自学笔记】支持向量机(2)——核函数

引入 核函数的功能是将一组数据映射到更高维的特征空间&#xff0c;这样可以让在低维无法线性分类的数据能够在高维空间下被分类。   可以证明&#xff0c;如果原始数据是有限的维度&#xff0c;那么一定存在一个高维特征空间使得样本线性可分。 文章内容由《机器学习》相关内…