数据结构——实验七·排序

欢迎各位大佬们来到Tubishu的博客🌟
Tubishu是一名计算机本科生,不定期发送一些在学校的成果供佬们消遣~希望能为佬的编程之路添砖加瓦⭐🔥
求各位大佬们垂怜🔥点赞评论一下呗🔥🔥
本文专栏 ➡️ 数据结构

排序

本实验是基于C实现对一组数据进行排序,包括直接插入排序、折半插入排序、希尔排序、冒泡排序、快速排序、简单选择排序、堆排序和2-路归并排序这5种排序算法。

实验目的:

  • 掌握各种排序算法的基本思想
  • 掌握各种排序算法的实现方法

实验内容:

对一组数据进行排序,可选择直接插入排序、折半插入排序、希尔排序、冒泡排序、快速排序、简单选择排序、堆排序和2-路归并排序中的任意5种排序算法实现。
要求:设计菜单,根据菜单提示进行操作。


实验产出:

1.实验原理:
排序算法是将一组数据按照特定顺序排列的方法。常见的排序算法包括:
冒泡排序:通过重复交换相邻未按顺序排列的元素。
选择排序:每次从未排序部分选择最小元素放到已排序部分的末尾。
插入排序:构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。
快速排序:通过一趟排序将待排序序列分割成两部分,其中一部分的所有元素都比另一部分小,然后递归地排序两部分。
归并排序:将数组分成两部分,分别排序后再合并。

2.核心代码:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>#define MAXSIZE 100           // 顺序表最大长度
typedef int KeyType;          // 定义关键字类型为整型
typedef int InfoType;         // 定义其他数据项类型
typedef struct {              // 定义每个记录(数据元素)的结构KeyType key ;             // 关键字项 InfoType otherinfo;       // 其他数据项
} RedType;                    // 记录类型
typedef struct {              // 定义顺序表的结构RedType r[MAXSIZE+1];     // 存储顺序表,r[0]闲置、缓存或用作哨兵单元int length;               // 顺序表的长度
} SqList;// 直接插入排序
void InsertSort(SqList &L)
{ // 对顺序表L做直接插入排序for (int i=2; i<=L.length; i++) {if ( L.r[i].key < L.r[i-1].key ) { // 将L.r[i]插入有序子表L.r[0]=L.r[i];                 // 将L.r[0]看作监视哨,将待插入的记录暂存到此处L.r[i]=L.r[i-1];               // 将r[i-1]后移int j=0;for(j=i-2; L.r[0].key<L.r[j].key; --j) // 从后向前寻找插入位置L.r[j+1]=L.r[j];                   // 记录逐个后移,直到找到插入位置L.r[j+1]=L.r[0];                       // 将r[0]即原r[i],插入到正确位置}}
}// 折半插入排序
void BInsertSort (SqList &L )
{ // 对顺序表L做折半插入排序int low, high, m;for (int i=2; i<= L.length ; ++i ) {L.r[0] = L.r[i];                // 将待插入的记录暂时存到监视哨中low = 1 ; high = i-1 ;          // 置查找区间初值while ( low <= high ) {         // 在r[low..high]中折半查找插入的位置m = ( low + high ) / 2 ;    // 折半if ( L.r[0].key < L.r[m]. key ) high = m -1; //插入点在前一子表else low = m + 1;                            // 插入点在后一子表}for (int j=i-1; j>=high+1; --j )L.r[j+1] = L.r[j]; // 记录后移L.r[high+1] = L.r[0];  // 将r[0]即原r[i]插入到正确位置}
}// 希尔排序
void ShellInsert(SqList &L, int dk)
{ // 对顺序表L做一趟增量是dk的希尔插入排序for( int i=dk+1; i<=L.length; ++ i) {if (L.r[i].key < L.r[i-dk].key) {   // 需将L.r[i]插入有序增量子表L.r[0]=L.r[i];                  // 暂存在L.r[0]int j=0;for(j=i-dk; j>0 &&(L.r[0].key<L.r[j].key); j-=dk)L.r[j+dk]=L.r[j];           // 记录后移,直到找到插入位置L.r[j+dk]=L.r[0];}}
}void ShellSort(SqList &L)
{ // 按增量序列dt[ ]对顺序表L作Shell排序int dt[5]={11,7,5,1}, t=4;for (int k=0; k<t; ++k)ShellInsert(L, dt[k]); // 增量为dt[k]的希尔插入排序
}// 冒泡排序
void BubbleSort(SqList &L)
{ // 对顺序表L做冒泡排序int m,j,flag=1;RedType x;m=L.length-1;while(m>0 && flag) {flag=0;         // flag置为0,如果本趟排序没有发生交换,则不会执行下一趟排序for(j=1; j<=m; j++) {if (L.r[j].key>L.r[j+1].key) {flag=1; // flag置为1,表示本趟排序发生了交换x=L.r[j]; L.r[j]=L.r[j+1]; L.r[j+1]=x; // 交换前后两个记录}}m--;}
}// 快速排序
void QuickSort(SqList &L, int low, int high)
{int left=low, right=high;RedType temp=L.r[low]; // 用子表的第一个记录做枢轴记录while (low<high) {     // 从表的两端交替地向中间扫描while((L.r[high].key >= temp.key) && (low<high)) high--;if (low<high) L.r[low++].key=L.r[high].key; // 将比枢轴记录小的记录移到低端while((L.r[low].key<=temp.key) && (low<high)) low++;if (low<high) L.r[high--].key=L.r[low].key; // 将比枢轴记录大的记录移到高端}L.r[low]=temp; // 一次划分得到枢轴记录的正确位置,存枢轴记录if(left<low-1) QuickSort(L,left,low-1);  // 递归调用,排序左子表if(low+1<right)QuickSort(L,low+1,right); // 递归调用,排序右子表
}// 简单选择排序
void SelectSort(SqList &L)
{ // 对顺序表L做简单选择排序int i, j, k;for (i=1; i<L.length; i++) {      // 做第i趟排序(1≤i≤L.length-1)k=i;for (j=i+1; j<=L.length; j++) // 在当前无序区L.r[j]...L.r[L.length]中选关键// 字最小的记录L.r[k]if (L.r[j].key < L.r[k].key)k=j; // k记下目前找到的最小关键字所在的位置if (k!=i) {  // 交换L.r[i]和L.r[k]L.r[0]=L.r[i];L.r[i]=L.r[k];L.r[k]=L.r[0]; // L.r[0]作暂存单元} // endif}     // endfor
}         // SeleetSort// 堆排序
void HeapAdjust(SqList &L, int s, int m)
{ // 本算法以大根堆为例// 假设L.r[s+1]…L.r[m]已经是堆,将L.r[s]…L.r[m]调整为以L.r[s]为根的大根堆RedType rc=L.r[s];for (int j=2*s; j<=m; j*=2) { // 沿关键字较大的子结点向下筛选if (j<m && L.r[j].key<L.r[j+1].key)j++;                         // j为关键字较大的记录的下标if (rc.key >= L.r[j].key) break; // 满足堆条件,退出L.r[s]=L.r[j]; s=j;              // 使s结点满足堆定义,再求子树j是否满足堆条件}L.r[s]=rc; // 插入
}// 建堆
void CreatHeap(SqList &L)
{ // 把无序序列L.r[1]…L.r[n]建成一个大根堆int n=L.length;for (int i=n/2; i>0; --i) // 反复调用HeapAdjust建堆HeapAdjust(L,i,n);
}// 堆排序
void HeapSort(SqList &L)
{ // 对顺序表L进行堆排序RedType x;CreatHeap(L); // 建堆for(int i=L.length; i>1; i--) {x=L.r[1]; // 将堆顶记录和当前未经排序子序列L.r[2]…L.r[i]中最后一个记录互换L.r[1] = L.r[i];L.r[i] =x;HeapAdjust(L, 1, i-1); // 将元素L.r[1]...L.r[i-1]重新调整为堆}
}// 归并排序
void Merge (SqList &R, SqList &T, int low, int mid, int high)
{ // 将有序表R.r[low]…R.r[mid]和R.r[mid+1]…R.r[high]归并为有序表T.r[low]..T.r[high]int i=0;int j=0;int k=0;for (i=low, j=mid+1, k=low; i<=mid && j<=high; k++) {if (R.r[i].key<=R.r[j].key) T.r[k]=R.r[i++]; // 将R中记录由小到大并入T中else T.r[k]=R.r[j++];}while (i<=mid) T.r[k++]=R.r[i++];   // 将剩余的元素R.r[i]..R.r[mid]复制到T中while (j<=high) T.r[k++]=R.r[j++];  // 将剩余的元素R.r[j]..R.r[high]复制到T中
}void MergeSort(SqList &R, SqList &T, SqList &S,int low, int high)
{ // R.r[low]…R.r[high]归并排序后存入T中,S仅用作临时存放数据元素if (low==high) T.r[low]=R.r[low];else {int mid=(low+high)/2;        // 将当前序列一分为二,求出分裂点midMergeSort(R,S,T,low,mid);    // 对子序列R.r[low]..R.r[mid]归并排序,// 结果放入S.r[low]..S.r[mid]MergeSort(R,S,T,mid+1,high); // 对子序列R.r[mid+1]..R.r[high]归并排序,// 结果放入S.r[mid+1]..S.r[high]Merge(S,T,low,mid,high);     // 将S.r[low]..S.r[mid]和S.r[mid+1]..S.r[high]// 归并到T.r[low]..T.r[high]}
}void print(SqList R)
{for(int i=1; i<=R.length; i++){if((i-1)%10==0) printf("\n");printf("%6d", R.r[i].key);}printf("\n");
}void producerandom(SqList &T)
{srand(time(NULL));            // time()返回从某点开始到现在的秒数,设置随机种子。for(int i=1; i<=MAXSIZE; i++)T.r[i].key = rand()%1000; // 产生0-1000之间的随机数T.length=MAXSIZE;print(T);                     // 输出随机数
}// 显示菜单 
void showmenu()
{printf("\n\n");printf("\t            ----排序----            \n");printf("\t************************************\n");printf("\t*       1-------产生随机数         *\n");printf("\t*       2-------直接插入排序       *\n");printf("\t*       3-------折半插入排序       *\n");printf("\t*       4-------希尔排序           *\n");printf("\t*       5-------冒泡排序           *\n");printf("\t*       6-------快速排序           *\n");printf("\t*       7-------简单选择排序       *\n");printf("\t*       8-------堆排序             *\n");printf("\t*       9-------2-路归并排序       *\n");printf("\t*                                  *\n");printf("\t*       0-------退出               *\n");printf("\t************************************\n");
}void Sort()
{SqList R,T,S; // T存放原始数据,R存放排序后的数据,S临时变量char choice = 'N';int randfl = 0; // 随机数产生标志,0 无,1有    while(choice!='0'){printf("\n请选择菜单号(0--9): ");scanf("%c",&choice); getchar(); // clear '\n'switch (choice){case '1':printf("\n\t产生随机数......\n");producerandom(T);randfl = 1; // 随机数已产生            break;case '2':if (randfl == 0)printf("\n\t 请先产生随机数\n");else {printf("\n\t 直接插入排序\n");R=T; // 将T复制给R,使R等于原始数据InsertSort(R);print(R);}break;case '3':if (randfl == 0)printf("\n\t 请先产生随机数\n");else {printf("\n\t 折半插入排序\n");R=T; // 将T复制给R,使R等于原始数据BInsertSort(R);print(R);}break;case '4':if (randfl == 0)printf("\n\t 请先产生随机数\n");else {printf("\n\t 希尔排序\n");R=T; // 将T复制给R,使R等于原始数据ShellSort(R);print(R);}break;case '5':if (randfl == 0)printf("\n\t 请先产生随机数\n");else {printf("\n\t 冒泡排序\n");R=T; // 将T复制给R,使R等于原始数据BubbleSort(R);print(R);}break;case '6':if (randfl == 0) {printf("\n\t 请先产生随机数\n");}else {printf("\n\t 快速排序\n");R=T; // 将T复制给R,使R等于原始数据QuickSort(R, 1, R.length);print(R);}break;case '7':if (randfl == 0) {printf("\n\t 请先产生随机数\n");}else {printf("\n\t 简单选择排序\n");R=T; // 将T复制给R,使R等于原始数据SelectSort(R);print(R);}break;case '8':if (randfl == 0) {printf("\n\t 请先产生随机数\n");}else {printf("\n\t 堆排序\n");R=T; // 将T复制给R,使R等于原始数据HeapSort(R);print(R);}break;case '9':if (randfl == 0) {printf("\n\t 请先产生随机数\n");}else {printf("\n\t 归并排序\n");R=T; // 将T复制给R,使R等于原始数据S=T;MergeSort(R,R,S,1,R.length);print(R);}break;case '0':printf("\n\t 程序结束!\n");break;default:printf("\n\t 输入错误,请重新输入!\n");}}
}int main()
{showmenu(); Sort();return 0;
}

3.运行结果:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

其他的排序结果赶快去用代码实操看看叭

4.调试:
未生成随机数直接排序:
在这里插入图片描述

5.性能分析:
1.时间复杂度分析
时间复杂度是衡量算法运行时间随数据规模增长而增长的速率。
1.1冒泡排序
平均时间复杂度:O(n²)
最坏时间复杂度:O(n²)
最好时间复杂度:O(n)(当数据已经有序时)
稳定性:稳定
分析:
冒泡排序通过重复比较相邻元素并交换它们来实现排序。在最坏情况下,每对元素都需要交换,导致时间复杂度为O(n²)。在最好情况下,数据已经有序,只需进行一次遍历,时间复杂度为O(n)。
实验结果:
在实验中,冒泡排序在处理大规模数据时表现不佳。
1.2选择排序
平均时间复杂度:O(n²)
最坏时间复杂度:O(n²)
最好时间复杂度:O(n²)
稳定性:不稳定
分析:
选择排序每次从未排序部分选择最小元素放到已排序部分的末尾。无论数据是否有序,选择排序都需要进行n(n-1)/2次比较,因此时间复杂度始终为O(n²)。
实验结果:
选择排序在处理大规模数据时性能较差。
1.3插入排序
平均时间复杂度:O(n²)
最坏时间复杂度:O(n²)
最好时间复杂度:O(n)(当数据已经有序时)
稳定性:稳定
分析:
插入排序通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。在最好情况下,数据已经有序,只需进行一次遍历,时间复杂度为O(n)。在最坏情况下,每插入一个元素都需要移动所有已排序元素,时间复杂度为O(n²)。
实验结果:
插入排序在处理小规模数据时表现良好,但在处理大规模数据时性能下降。
1.4快速排序
平均时间复杂度:O(n log n)
最坏时间复杂度:O(n²)(当枢轴选择不当,如数据已经有序时)
最好时间复杂度:O(n log n)
稳定性:不稳定
分析:
快速排序通过一趟排序将待排序序列分割成两部分,其中一部分的所有元素都比另一部分小,然后递归地排序两部分。在平均情况下,时间复杂度为O(nlogn)。在最坏情况下,如数据已经有序且枢轴选择不当,时间复杂度退化为O(n²)。
实验结果:
快速排序在处理大规模数据时表现最佳。
1.5归并排序
平均时间复杂度:O(nlogn)
最坏时间复杂度:O(nlogn)
最好时间复杂度:O(nlogn)
稳定性:稳定
分析:
归并排序将数组分成两部分,分别排序后再合并。由于每次递归都将数组分成两半,因此时间复杂度始终为O(nlogn)。归并排序需要额外的空间来存储合并后的数组。
实验结果:
归并排序在处理大规模数据时性能稳定。
2.空间复杂度分析
空间复杂度是衡量算法运行过程中临时占用存储空间大小的指标。
2.1冒泡排序、选择排序、插入排序
空间复杂度:O(1)(原地排序)
分析:
这三种排序算法都是原地排序,不需要额外的存储空间。
2.2快速排序
空间复杂度:O(logn)(递归调用栈)
分析:
快速排序在递归调用时需要使用栈空间。在平均情况下,空间复杂度为O(logn)。
2.3归并排序
空间复杂度:O(n)(需要额外的数组存储合并结果)
分析:
归并排序需要额外的空间来存储合并后的数组,空间复杂度为O(n)。

3.性能对比总结
排序算法平均时间复杂度最坏时间复杂度最好时间复杂度稳定性空间复杂度
冒泡排序O(n²)O(n²)O(n)稳定O(1)
选择排序O(n²)O(n²)O(n²)不稳定O(1)
插入排序O(n²)O(n²)O(n)稳定O(1)
快速排序O(n log n)O(n²)O(n log n)不稳定O(log n)
归并排序O(n log n)O(n log n)O(n log n)稳定O(n)

总结

(1)掌握了各种排序算法的基本思想;
(2)掌握了各种排序算法的实现方法。
快速排序在实验中表现最佳,验证了其在平均情况下的高效性。
冒泡排序和选择排序在处理大规模数据时效率较低,符合理论预期。
插入排序在处理小规模数据时表现良好,但在处理大规模数据时性能下降。
归并排序虽然性能稳定,但需要额外的空间,实验中需要考虑内存使用情况。

佬~来都来了 点个赞👍、评论一下💬呗🥺你的支持是Tubishu不断前行的源泉✨!衷心感谢你的鼓励与陪伴🙏!
愿各位大佬们在技术的道路上,代码顺畅无阻💻,思路清晰如光💡,不断突破自我,向着更高的目标迈进,实现自己的梦想!🎉
再次感谢大佬的莅临🌸

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用vscode + Roo Code (prev. Roo Cline)+DeepSeek-R1使用一句话需求做了个实验

摘要 使用vscode、Roo Code和deepseek-reasoner进行了一个实验&#xff0c;尝试使用一句话需求来生成小红书封面图片。工具根据需求提供了详细的架构方案&#xff0c;包括技术栈选择、核心模块划分、目录结构建议等。然后&#xff0c;工具自动化地完成了开发和测试&#xff0c;…

vscode环境中用仓颉语言开发时调出覆盖率的方法

在vscode中仓颉语言想得到在idea中利用junit和jacoco的覆盖率&#xff0c;需要如下几个步骤&#xff1a; 1.在vscode中搭建仓颉语言开发环境&#xff1b; 2.在源代码中右键运行[cangjie]coverage. 思路1&#xff1a;编写了测试代码的情况&#xff08;包管理工具&#xff09; …

基于SpringBoot+WebSocket的前后端连接,并接入文心一言大模型API

前言&#xff1a; 本片博客只讲述了操作的大致流程&#xff0c;具体实现步骤并不标准&#xff0c;请以参考为准。 本文前提&#xff1a;熟悉使用webSocket 如果大家还不了解什么是WebSocket&#xff0c;可以参考我的这篇博客&#xff1a; rWebSocket 详解&#xff1a;全双工…

積分方程與簡單的泛函分析8.具連續對稱核的非齊次第II類弗雷德霍姆積分算子方程

1)def求解具連續對稱核的非齊次第II類弗雷德霍姆積分算子方程 设 是定义在上的连续对称核函数&#xff0c; 非齐次第二类弗雷德霍姆积分算子方程的形式为&#xff1a; &#xff0c; 其中是未知函数&#xff0c;是给定的连续函数&#xff0c;是参数。 2)def其特徵值是否一致…

RV1126画面质量四:GOP改善画质

一&#xff0e; 什么是 GOP GOP 实际上就是两个 I 帧的间隔&#xff0c;比方说分辨率是 1920 * 1080 50 帧&#xff0c;假设 GOP 为 5&#xff0c;那就是大概 2s 插入一个 I 帧。我们再 回顾下&#xff0c;H264/H265 的帧结构。H264/H265 分别分为三种帧类型&#xff1a;I 帧、…

一文了解二叉树的基本概念

文章目录 二叉树1二叉树的定义及其主要特征1.1二叉树的定义1.2二叉树的特点1.3二叉树的五种形态1.4二叉树与度为2的有序树的区别1.5几个特殊的二叉树1.6二叉树的性质 2二叉树的存储结构2.1二叉树的顺序存储2.2二叉树的链式存储 二叉树 1二叉树的定义及其主要特征 1.1二叉树的定…

MAX98357A一款数字脉冲编码调制(PCM)输入D类音频功率放大器

MAX98357A是一款数字脉冲编码调制&#xff08;PCM&#xff09;输入D类音频功率放大器&#xff0c;以下是对其的详细介绍&#xff1a; 一、主要特性 音频性能&#xff1a; 提供D类效率与AB类音频性能。支持高达3.2W&#xff08;4Ω负载&#xff0c;5V供电&#xff09;的输出功率…

nacos(基于docker最详细安装)

1、什么是Spring Cloud Spring Cloud是一系列框架的集合。它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发&#xff0c;如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等&#xff0c;都可以用Spring Boot的开发风格做到一键启动和部署。…

78,【2】BUUCTF WEB .[安洵杯 2019]不是文件

进入靶场 解题过程 点击最下面的英文字即可上传图片 新建一个文本文档 里面内容为空 更改名字为 1,2,3,4,0x4f3a363a2268656c706572223a323a7b733a393a22002a00696676696577223b623a313b733a393a22002a00636f6e666967223b733a353a222f666c6167223b7d)#.png 知道id1&#x…

Git 如何将旧仓库迁移新仓库中,但不显示旧的提交记录

一、异常错误 场景&#xff1a;我想把旧仓库迁移新仓库中&#xff0c;放进去之后&#xff0c;新仓库会显示这个项目之前的所有提交&#xff0c;如何不显示这些旧的提交&#xff1f; 二、原因 我们需要将旧仓库迁移新仓库中&#xff0c;但是又不想在新仓库中显示旧的提交记录…

Mysql索引(学习自用)

目录 一、索引概述 优缺点 二、索引结构 1、索引数据结构 2、索引支持结构 3、B树 4、B树 5、hash索引 6、为啥采用B树索引 三、索引分类 四、索引语法 五、索引性能分析 5.1查看执行频率 5.2慢查询日志 5.3profiling 5.4explain 六、索引使用规则 6.1验证索…

PSD是什么图像格式?如何把PSD转为JPG格式?

在图形设计的世界里&#xff0c;Photoshop 文档&#xff08;PSD&#xff09;格式是 Adobe Photoshop 的原生文件格式&#xff0c;它允许设计师保存图像中的图层、蒙版、透明度和不同色彩模式等信息。对于需要进一步编辑的设计作品来说&#xff0c;PSD 文件提供了极大的灵活性。…

基于物联网的风机故障检测装置的设计与实现

1 系统总体设计方案 通过对风机故障检测装置的设计与实现的需求、可行性进行分析&#xff0c;本设计风机故障检测装置的设计与实现的系统总体架构设计如图2-1所示&#xff0c;系统风机故障检测装置采用STM32F103单片机作为控制器&#xff0c;并通过DS18B20温度传感器、ACS712电…

全面评测 DOCA 开发环境下的 DPU:性能表现、机器学习与金融高频交易下的计算能力分析

本文介绍了我在 DOCA 开发环境下对 DPU 进行测评和计算能力测试的一些真实体验和记录。在测评过程中&#xff0c;我主要关注了 DPU 在高并发数据传输和深度学习场景下的表现&#xff0c;以及基本的系统性能指标&#xff0c;包括 CPU 计算、内存带宽、多线程/多进程能力和 I/O 性…

websocket实现

由于安卓资源管理器展示的路径不尽相同,各种软件保存文件的位置也不一定一样.对于普通用户上传文件时,查找文件可能是一个麻烦的事情.后来想到了一个办法,使用pc端进行辅助上传. 文章目录 实现思路1.0 实现定义web与客户端通信数据类型和数据格式web端websocket实现web端对客户…

【科研建模】Pycaret自动机器学习框架使用流程及多分类项目实战案例详解

Pycaret自动机器学习框架使用流程及项目实战案例详解 1 Pycaret介绍2 安装及版本需求3 Pycaret自动机器学习框架使用流程3.1 Setup3.2 Compare Models3.3 Analyze Model3.4 Prediction3.5 Save Model4 多分类项目实战案例详解4.1 ✅ Setup4.2 ✅ Compare Models4.3 ✅ Experime…

CY T 4 BB 5 CEB Q 1 A EE GS MCAL配置 - MCU组件

1、ResourceM 配置 选择芯片信号: 2、MCU 配置 2.1 General配置 1) McuDevErrorDetect: - 启用或禁用MCU驱动程序模块的开发错误通知功能。 - 注意:采用DET错误检测机制作为安全机制(故障检测)时,不能禁用开发错误检测。2) McuGetRamStateApi - enable/disable th…

docker 安装 mysql 详解

在平常的开发工作中&#xff0c;我们经常需要用到 mysql 数据库。那么在docker容器中&#xff0c;应该怎么安装mysql数据库呢。简单来说&#xff0c;第一步&#xff1a;拉取镜像&#xff1b;第二步&#xff1a;创建挂载目录并设置 my.conf&#xff1b;第三步&#xff1a;启动容…

【2025年数学建模美赛E题】(农业生态系统)完整解析+模型代码+论文

生态共生与数值模拟&#xff1a;生态系统模型的物种种群动态研究 摘要1Introduction1.1Problem Background1.2Restatement of the Problem1.3Our Work 2 Assumptions and Justifications3 Notations4 模型的建立与求解4.1 农业生态系统模型的建立与求解4.1.1 模型建立4.1.2求解…

编码器和扩散模型

目录 摘要abstract1.自动编码器2.变分编码器&#xff08;VAE&#xff09;3.论文阅读3.1 介绍3.2 方法3.3 结论 4.总结参考文献 摘要 本周学习了自动编码器&#xff08;AE&#xff09;和变分自动编码器&#xff08;VAE&#xff09;的基本原理与实现&#xff0c;分析其在数据降维…