当前位置: 首页 > news >正文

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

欢迎各位大佬们来到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不断前行的源泉✨!衷心感谢你的鼓励与陪伴🙏!
愿各位大佬们在技术的道路上,代码顺畅无阻💻,思路清晰如光💡,不断突破自我,向着更高的目标迈进,实现自己的梦想!🎉
再次感谢大佬的莅临🌸

相关文章:

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

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

JVM堆空间

JVM&#xff08;Java虚拟机&#xff09;堆空间是Java内存管理的核心区域之一&#xff0c;用于存储Java对象实例。以下是关于JVM堆空间的详细介绍&#xff1a; 1. 堆空间的作用 • 存储对象实例&#xff1a;几乎所有的Java对象实例&#xff08;通过new关键字创建的对象&#xf…...

【详细】SSH公私钥认证与渗透测试攻击场景

SSH&#xff08;Secure Shell&#xff09;是一个用于远程登录和执行命令的网络协议&#xff0c;其认证方式通常有两种&#xff1a;基于密码的认证和基于公私钥的认证。本文将详细介绍SSH公私钥认证机制&#xff0c;并探讨在渗透测试场景中&#xff0c;如何利用对靶机具有读取和…...

常见的多媒体框架(FFmpeg GStreamer DirectShow AVFoundation OpenMax)

1.FFmpeg FFmpeg是一个非常强大的开源多媒体处理框架&#xff0c;它提供了一系列用于处理音频、视频和多媒体流的工具和库。它也是最流行且应用最广泛的框架&#xff01; 官方网址&#xff1a;https://ffmpeg.org/ FFmpeg 的主要特点和功能&#xff1a; 编解码器支持: FFmpe…...

C++异步future

&#x1f30e; C11异步futrue 文章目录&#xff1a; C11异步futrue future介绍     应用场景     future操作       std::async函数模版       std::packaged_task类模版       std::promise类模版 &#x1f680;future介绍 std::future是C11标准库…...

Oracle 12c 中的 CDB和PDB的启动和关闭

一、简介 Oracle 12c引入了多租户架构&#xff0c;允许一个容器数据库&#xff08;Container Database, CDB&#xff09;托管多个独立的可插拔数据库&#xff08;Pluggable Database, PDB&#xff09;。本文档旨在详细描述如何启动和关闭CDB及PDB。 二、容器数据库 (CDB) 2.1…...

Vue组件开发-使用 html2canvas 和 jspdf 库实现PDF文件导出 设置页面大小及方向

在 Vue 项目中实现导出 PDF 文件、调整文件页面大小和页面方向的功能&#xff0c;使用 html2canvas 将 HTML 内容转换为图片&#xff0c;再使用 jspdf 把图片添加到 PDF 文件中。以下是详细的实现步骤和代码示例&#xff1a; 步骤 1&#xff1a;安装依赖 首先&#xff0c;在项…...

chrome插件:网页图片高清下载

前置条件&#xff1a; 安装有chrome谷歌浏览器的电脑 使用步骤&#xff1a; 1.打开chrome扩展插件 2.点击管理扩展程序 3.加载已解压的扩展程序 4.选择对应文件夹 5.成功后会出现一个扩展小程序 6.点击对应小程序 7.输入需要访问的网址&#xff0c;点击扩展插件即可进行图片…...

汽车定速巡航

配备定速巡航功能的车型&#xff0c;一般在方向盘附近设有4~6个按键&#xff08;可能共用键位&#xff09;。 要设置定速巡航&#xff0c;不仅需要方向盘上的按键&#xff0c;还要油门配合。 设置的一般流程&#xff1a; 开关&#xff1a;类似步枪上的“保险”&#xff0c;按…...

CNN-BiLSTM卷积双向长短期记忆神经网络时间序列预测(Matlab完整源码和数据)

CNN-BiLSTM卷积双向长短期记忆神经网络时间序列预测&#xff08;Matlab完整源码和数据&#xff09; 目录 CNN-BiLSTM卷积双向长短期记忆神经网络时间序列预测&#xff08;Matlab完整源码和数据&#xff09;预测效果基本介绍 CNN-BiLSTM卷积双向长短期记忆神经网络时间序列预测一…...

WPF基础 | WPF 布局系统深度剖析:从 Grid 到 StackPanel

WPF基础 | WPF 布局系统深度剖析&#xff1a;从 Grid 到 StackPanel 一、前言二、Grid 布局&#xff1a;万能的布局王者2.1 Grid 布局基础&#xff1a;构建网格世界2.2 子元素定位与跨行列&#xff1a;布局的精细操控2.3 自适应布局&#xff1a;灵活应变的秘诀 三、StackPanel…...

14-6-2C++STL的list

(一&#xff09;list对象的带参数构造 1.list&#xff08;elem);//构造函数将n个elem拷贝给本身 #include <iostream> #include <list> using namespace std; int main() { list<int> lst(3,7); list<int>::iterator it; for(itlst.begi…...

【AI论文】Sigma:对查询、键和值进行差分缩放,以实现高效语言模型

摘要&#xff1a;我们推出了Sigma&#xff0c;这是一个专为系统领域设计的高效大型语言模型&#xff0c;其独特之处在于采用了包括DiffQKV注意力机制在内的新型架构&#xff0c;并在我们精心收集的系统领域数据上进行了预训练。DiffQKV注意力机制通过根据查询&#xff08;Q&…...

私域流量池构建与转化策略:以开源链动2+1模式AI智能名片S2B2C商城小程序为例

摘要&#xff1a;随着互联网技术的快速发展&#xff0c;流量已成为企业竞争的关键资源。私域流量池&#xff0c;作为提升用户转化率和增强用户粘性的有效手段&#xff0c;正逐渐受到企业的广泛关注。本文旨在深入探讨私域流量池构建的目的、优势及其在实际应用中的策略&#xf…...

vofa++使用方法

控件区可以添加控件用来啊多样显示 点击一个控件然后右键可以选择要添加显示的数据&#xff0c;点all表全部显示&#xff0c; 点auto可以自动布局 要用控件需要选择协议&#xff0c;不知道协议具体格式可以点击问号看看&#xff0c;并且最好用printf重定义来实现 比如我要实现F…...

LogicFlow 一款流程图编辑框架

LogicFlow是什么 LogicFlow是一款流程图编辑框架&#xff0c;提供了一系列流程图交互、编辑所必需的功能和灵活的节点自定义、插件等拓展机制。LogicFlow支持前端自定义开发各种逻辑编排场景&#xff0c;如流程图、ER图、BPMN流程等。在工作审批流配置、机器人逻辑编排、无代码…...

HTML<kbd>标签

例子 在文档中将一些文本定义为键盘输入&#xff1a; <p>Press <kbd>Ctrl</kbd> <kbd>C</kbd> to copy text (Windows).</p> <p>Press <kbd>Cmd</kbd> <kbd>C</kbd> to copy text (Mac OS).</p>…...

PyQt6医疗多模态大语言模型(MLLM)实用系统框架构建初探(上.文章部分)

一、引言 1.1 研究背景与意义 在数字化时代,医疗行业正经历着深刻的变革,智能化技术的应用为其带来了前所未有的发展机遇。随着医疗数据的指数级增长,传统的医疗诊断和治疗方式逐渐难以满足现代医疗的需求。据统计,全球医疗数据量预计每年以 48% 的速度增长,到 2025 年将…...

150 Linux 网络编程6 ,从socket 到 epoll整理。listen函数参数再研究

一 . 只能被一个client 链接 socket例子 此例子用于socket 例子&#xff0c; 该例子只能用于一个客户端连接server。 不能用于多个client 连接 server socket_server_support_one_clientconnect.c /* 此例子用于socket 例子&#xff0c; 该例子只能用于一个客户端连接server。…...

深入浅出 SQLSugar:快速掌握高效 .NET ORM 框架

SQLSugar 是一个高效、易用的 .NET ORM 框架&#xff0c;支持多种数据库&#xff08;如 SQL Server、MySQL、PostgreSQL 等&#xff09;。它提供了丰富的功能&#xff0c;包括 CRUD 操作、事务管理、动态表名、多表联查等&#xff0c;开发者可以通过简单的链式操作实现复杂的数…...

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...

在软件开发中正确使用MySQL日期时间类型的深度解析

在日常软件开发场景中&#xff0c;时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志&#xff0c;到供应链系统的物流节点时间戳&#xff0c;时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库&#xff0c;其日期时间类型的…...

深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录

ASP.NET Core 是一个跨平台的开源框架&#xff0c;用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录&#xff0c;以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...

云计算——弹性云计算器(ECS)

弹性云服务器&#xff1a;ECS 概述 云计算重构了ICT系统&#xff0c;云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台&#xff0c;包含如下主要概念。 ECS&#xff08;Elastic Cloud Server&#xff09;&#xff1a;即弹性云服务器&#xff0c;是云计算…...

java 实现excel文件转pdf | 无水印 | 无限制

文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...

项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)

Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败&#xff0c;具体原因是客户端发送了密码认证请求&#xff0c;但Redis服务器未设置密码 1.为Redis设置密码&#xff08;匹配客户端配置&#xff09; 步骤&#xff1a; 1&#xff09;.修…...

Xen Server服务器释放磁盘空间

disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...

【VLNs篇】07:NavRL—在动态环境中学习安全飞行

项目内容论文标题NavRL: 在动态环境中学习安全飞行 (NavRL: Learning Safe Flight in Dynamic Environments)核心问题解决无人机在包含静态和动态障碍物的复杂环境中进行安全、高效自主导航的挑战&#xff0c;克服传统方法和现有强化学习方法的局限性。核心算法基于近端策略优化…...

windows系统MySQL安装文档

概览&#xff1a;本文讨论了MySQL的安装、使用过程中涉及的解压、配置、初始化、注册服务、启动、修改密码、登录、退出以及卸载等相关内容&#xff0c;为学习者提供全面的操作指导。关键要点包括&#xff1a; 解压 &#xff1a;下载完成后解压压缩包&#xff0c;得到MySQL 8.…...

【Linux】自动化构建-Make/Makefile

前言 上文我们讲到了Linux中的编译器gcc/g 【Linux】编译器gcc/g及其库的详细介绍-CSDN博客 本来我们将一个对于编译来说很重要的工具&#xff1a;make/makfile 1.背景 在一个工程中源文件不计其数&#xff0c;其按类型、功能、模块分别放在若干个目录中&#xff0c;mak…...