数据结构——实验七·排序
欢迎各位大佬们来到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的博客🌟 Tubishu是一名计算机本科生,不定期发送一些在学校的成果供佬们消遣~希望能为佬的编程之路添砖加瓦⭐🔥 求各位大佬们垂怜🔥点赞评论一下呗🔥🔥 本文专栏 ➡️ 数据结构 …...
JVM堆空间
JVM(Java虚拟机)堆空间是Java内存管理的核心区域之一,用于存储Java对象实例。以下是关于JVM堆空间的详细介绍: 1. 堆空间的作用 • 存储对象实例:几乎所有的Java对象实例(通过new关键字创建的对象…...
【详细】SSH公私钥认证与渗透测试攻击场景
SSH(Secure Shell)是一个用于远程登录和执行命令的网络协议,其认证方式通常有两种:基于密码的认证和基于公私钥的认证。本文将详细介绍SSH公私钥认证机制,并探讨在渗透测试场景中,如何利用对靶机具有读取和…...
常见的多媒体框架(FFmpeg GStreamer DirectShow AVFoundation OpenMax)
1.FFmpeg FFmpeg是一个非常强大的开源多媒体处理框架,它提供了一系列用于处理音频、视频和多媒体流的工具和库。它也是最流行且应用最广泛的框架! 官方网址:https://ffmpeg.org/ FFmpeg 的主要特点和功能: 编解码器支持: FFmpe…...
C++异步future
🌎 C11异步futrue 文章目录: C11异步futrue future介绍 应用场景 future操作 std::async函数模版 std::packaged_task类模版 std::promise类模版 🚀future介绍 std::future是C11标准库…...
Oracle 12c 中的 CDB和PDB的启动和关闭
一、简介 Oracle 12c引入了多租户架构,允许一个容器数据库(Container Database, CDB)托管多个独立的可插拔数据库(Pluggable Database, PDB)。本文档旨在详细描述如何启动和关闭CDB及PDB。 二、容器数据库 (CDB) 2.1…...
Vue组件开发-使用 html2canvas 和 jspdf 库实现PDF文件导出 设置页面大小及方向
在 Vue 项目中实现导出 PDF 文件、调整文件页面大小和页面方向的功能,使用 html2canvas 将 HTML 内容转换为图片,再使用 jspdf 把图片添加到 PDF 文件中。以下是详细的实现步骤和代码示例: 步骤 1:安装依赖 首先,在项…...
chrome插件:网页图片高清下载
前置条件: 安装有chrome谷歌浏览器的电脑 使用步骤: 1.打开chrome扩展插件 2.点击管理扩展程序 3.加载已解压的扩展程序 4.选择对应文件夹 5.成功后会出现一个扩展小程序 6.点击对应小程序 7.输入需要访问的网址,点击扩展插件即可进行图片…...
汽车定速巡航
配备定速巡航功能的车型,一般在方向盘附近设有4~6个按键(可能共用键位)。 要设置定速巡航,不仅需要方向盘上的按键,还要油门配合。 设置的一般流程: 开关:类似步枪上的“保险”,按…...
CNN-BiLSTM卷积双向长短期记忆神经网络时间序列预测(Matlab完整源码和数据)
CNN-BiLSTM卷积双向长短期记忆神经网络时间序列预测(Matlab完整源码和数据) 目录 CNN-BiLSTM卷积双向长短期记忆神经网络时间序列预测(Matlab完整源码和数据)预测效果基本介绍 CNN-BiLSTM卷积双向长短期记忆神经网络时间序列预测一…...
WPF基础 | WPF 布局系统深度剖析:从 Grid 到 StackPanel
WPF基础 | WPF 布局系统深度剖析:从 Grid 到 StackPanel 一、前言二、Grid 布局:万能的布局王者2.1 Grid 布局基础:构建网格世界2.2 子元素定位与跨行列:布局的精细操控2.3 自适应布局:灵活应变的秘诀 三、StackPanel…...
14-6-2C++STL的list
(一)list对象的带参数构造 1.list(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:对查询、键和值进行差分缩放,以实现高效语言模型
摘要:我们推出了Sigma,这是一个专为系统领域设计的高效大型语言模型,其独特之处在于采用了包括DiffQKV注意力机制在内的新型架构,并在我们精心收集的系统领域数据上进行了预训练。DiffQKV注意力机制通过根据查询(Q&…...
私域流量池构建与转化策略:以开源链动2+1模式AI智能名片S2B2C商城小程序为例
摘要:随着互联网技术的快速发展,流量已成为企业竞争的关键资源。私域流量池,作为提升用户转化率和增强用户粘性的有效手段,正逐渐受到企业的广泛关注。本文旨在深入探讨私域流量池构建的目的、优势及其在实际应用中的策略…...
vofa++使用方法
控件区可以添加控件用来啊多样显示 点击一个控件然后右键可以选择要添加显示的数据,点all表全部显示, 点auto可以自动布局 要用控件需要选择协议,不知道协议具体格式可以点击问号看看,并且最好用printf重定义来实现 比如我要实现F…...
LogicFlow 一款流程图编辑框架
LogicFlow是什么 LogicFlow是一款流程图编辑框架,提供了一系列流程图交互、编辑所必需的功能和灵活的节点自定义、插件等拓展机制。LogicFlow支持前端自定义开发各种逻辑编排场景,如流程图、ER图、BPMN流程等。在工作审批流配置、机器人逻辑编排、无代码…...
HTML<kbd>标签
例子 在文档中将一些文本定义为键盘输入: <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 例子, 该例子只能用于一个客户端连接server。 不能用于多个client 连接 server socket_server_support_one_clientconnect.c /* 此例子用于socket 例子, 该例子只能用于一个客户端连接server。…...
深入浅出 SQLSugar:快速掌握高效 .NET ORM 框架
SQLSugar 是一个高效、易用的 .NET ORM 框架,支持多种数据库(如 SQL Server、MySQL、PostgreSQL 等)。它提供了丰富的功能,包括 CRUD 操作、事务管理、动态表名、多表联查等,开发者可以通过简单的链式操作实现复杂的数…...
Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误
HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误,它们的含义、原因和解决方法都有显著区别。以下是详细对比: 1. HTTP 406 (Not Acceptable) 含义: 客户端请求的内容类型与服务器支持的内容类型不匹…...
Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例
使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件,常用于在两个集合之间进行数据转移,如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model:绑定右侧列表的值&…...
前端开发面试题总结-JavaScript篇(一)
文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包(Closure)?闭包有什么应用场景和潜在问题?2.解释 JavaScript 的作用域链(Scope Chain) 二、原型与继承3.原型链是什么?如何实现继承&a…...
基于Java Swing的电子通讯录设计与实现:附系统托盘功能代码详解
JAVASQL电子通讯录带系统托盘 一、系统概述 本电子通讯录系统采用Java Swing开发桌面应用,结合SQLite数据库实现联系人管理功能,并集成系统托盘功能提升用户体验。系统支持联系人的增删改查、分组管理、搜索过滤等功能,同时可以最小化到系统…...
Spring是如何解决Bean的循环依赖:三级缓存机制
1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间互相持有对方引用,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...
七、数据库的完整性
七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...
MySQL 8.0 事务全面讲解
以下是一个结合两次回答的 MySQL 8.0 事务全面讲解,涵盖了事务的核心概念、操作示例、失败回滚、隔离级别、事务性 DDL 和 XA 事务等内容,并修正了查看隔离级别的命令。 MySQL 8.0 事务全面讲解 一、事务的核心概念(ACID) 事务是…...
PostgreSQL——环境搭建
一、Linux # 安装 PostgreSQL 15 仓库 sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-$(rpm -E %{rhel})-x86_64/pgdg-redhat-repo-latest.noarch.rpm# 安装之前先确认是否已经存在PostgreSQL rpm -qa | grep postgres# 如果存在࿰…...
【Veristand】Veristand环境安装教程-Linux RT / Windows
首先声明,此教程是针对Simulink编译模型并导入Veristand中编写的,同时需要注意的是老用户编译可能用的是Veristand Model Framework,那个是历史版本,且NI不会再维护,新版本编译支持为VeriStand Model Generation Suppo…...
