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

24.排序,插入排序,交换排序

目录

一. 插入排序

(1)直接插入排序

(2)折半插入排序

(3)希尔排序

二. 交换排序

(1)冒泡排序

(2)快速排序


排序:将一组杂乱无章的数据按一定规律顺次排列起来。即,将无序序列排成一个有序序列(由小到大或由大到小)的运算。如果参加排序的数据结点包含多个数据域,那么排序往往是针对其中某个域而言。

排序方法:

  • 按数据存储介质:内部排序和外部排序
  • 按比较器个数:串行排序和并行排序
  • 按主要操作:比较排序基数排序(后面会讲)
  • 按辅助空间:原地排序和非原地排序
  • 按稳定性:稳定排序和非稳定排序
  • 按自然性:自然排序和非自然排序

本章学习内容:

  • 插入排序:直接插入排序、折半插入排序、希尔排序
  • 交换排序:冒泡排序、快速排序
  • 选择排序:简单选择排序、堆排序
  • 归并排序:2-路归并排序
  • 基数排序

衡量排序算法的指标有时间复杂度,空间复杂度和稳定性等。对于稳定性做一点说明。稳定排序指的是能够使任何数值相等的元素,排序以后相对次序不变。例如,下面的示例1是稳定排序,示例2就不是稳定排序。

排序的稳定牲只对结构类型数据排序有意义。例如:n个学生信息(学号、姓名、语文、数学、英语、总分),首先按数学成绩从高到低排序,然后按照总分从高到低排序。若是稳定排序,总分相同的情况下,数学成绩高的仍然排在前面。

存储结构:本章基于的存储结构均以顺序表存储。

#define MAXSIZE 20  //设记录不超过20个
typedef int KeyType;  //设关键字为整型量(int型)typedef struct{  //定义每个记录(数据元素)的结构KeyType key;  //关键字InfoType otherinfo;  //其它数据项
}RedType;  //Record Typetypedef struct{  //定义顺序表的结构RedType r[MAXSIZE+1];  //存储顺序表的向量//r[0]一般作哨兵或缓冲区int length;  //顺序表的长度
}SqList;

一. 插入排序

基本思想:每步将一个待排序的对象,按其关键码大小,插入到前面已经排好序的一组对象的适当位置上,直到对象全部插入为止。即边插入边排序。

根据确定插入位置的方法不同,我们可以有以下三种插入排序的方法:

(1)直接插入排序

顺序法定位插入位置:一个一个比较。

  • 首先,复制待插入的元素,复制插入元素。x=a[i];
  • 然后,记录后移,查找插入位置;for(j=i-1; j>=0&&x<a[j];j--),a[j+1]=a[j];
  • 最后,插入到正确位置,a[j+1]=x;

对于复制待插入的元素,我们可以使用哨兵。把待插入的元素复制到0号位,这样省去了越界的判断:

此外,如果待插入元素比有序表最后一位还大,那就不用进行任何操作了,这个位置就是待插入元素的位置。

void InsertSort(SqList &L){int i, j;for(i=2; i<=L.length; ++i){  //第1个元素不用排序,从插入第2个元素开始if (L.r[i].key < L.r[i-1].key){  //若"<",需将L.r[i]插入有序子表L.r[0]=L.r[i];  //复制为哨兵for(j=i-1; L.r[0].key<L.r[j].key; --j){L.r[j+1]=L.r[j];  //记录后移}L.r[j+1]=L.r[0];  //插入到正确位置}}
}

下面我们来分析时间效率。实现排序的基本操作有两个:(1)“比较”序列中两个关键字的大小;(2)“移动”记录。最好的情况是,关键字在记录序列中顺序有序。这时比较的次数是\sum_{i=2}^{n}1=n-1,不需要移动。最坏的情况是,关键字在记录序列中逆序有序。这时比较的次数是\sum_{i=2}^{n}i=\frac{(n+2)(n-1)}{2},移动的次数是\sum_{i=2}^{n}(i+1)=\frac{(n+4)(n-1)}{2},从而我们可以得到以下结论:

  • 原始数据越接近有序,排序速度越快;
  • 最坏情况下(输入数据是逆有序的)Tw(n)=O(n^2);
  • 平均情况下,耗时差不多是最坏情况的一半Te(n)=O(n^2);
  • 空间复杂度是O(1);
  • 要提高查找速度,可以从减少元素的比较次数和减少元素的移动次数入手;

(2)折半插入排序

查找插入位置采用折半查找法。

void BlnsertSort (SqList &L){for (i = 2; i<= L.length ; ++i){  //依次插入第2~第n个元素L.r[0] = L.r[i];  //当前插入元素存到“哨兵”位置low = 1 ; high = i-1;  //采用二分查找法查找插入位置while (low <= high){mid = (low + high)/2;if (L.r[0].key < L.r[mid].key) high = mid-1;else low = mid + 1;}  //循环结束,high+1则为插入位置for (j=i-1; j>=high+1; --j) L.r[j+1] = L.r[j];  //移动元素L.r[high+1] = L.r[0];  //插入到正确位置
}// BInsertSort

最后我们分析算法的时间效率。折半查找比顺序查找快,所以折半插入排序就平均性能来说比直按插入排序要快。它所需要的关键码比较次数与待排序对象序列的初始排列无关,仅依赖于对象个数。在插入第i个对象时,需要经过\left \lfloor log_2i \right \rfloor+1次关键码比较,才能确定它应插入的位置。

当n较大时,总关键码比较次数比直接插入排序的最坏情况要好得多,但比其最好情况要差。在对象的初始排列已经按关键码排好序或接近有序时,直接插入排序比折半插入排序执行的关键码比较次数要少。对移动次数,折半插入排序的对象移动次数与直接插入排序相同,依赖于对象的初始排列。所以折半插入排序减少了比较次数,但没有减少移动次数。平均性能优于直接插入排序。其时间复杂度为O(n^2),空间复杂度是O(1),是一种稳定的排序方法。

(3)希尔排序

直接排序什么时候效率较高?一是序列基本有序,二是序列长度较小。基于此我们提出希尔排序的基本思路:先将整个待排记录序列分割成若干子序列,分别进行直接插入排序,待整个序列中的记录“基本有序”时,再对全体记录进行一次直接插入排序。希尔排序的算法特点是:

  • 一次移动,移动位置较大,跳跃式地接近排序后的最终位置
  • 最后一次只需要少量移动
  • 增量序列必须是递减的,最后一个必须是1
  • 增量序列应该是互质的

首先:定义增量序列D_k:D_M>D_{M-1}>...>D_1=1,刚才的例子中D=[5,3,1]
然后:对每个D_k进行“D_k-间隔”插入排序(k=M,M-1,...1)。

//主程序
void ShellSort(Sqlist &L,int dlta[],int t){//按增量序列dlta[0..t-1]对顺序表L作希尔排序,t是增量序列的长度for(k=O; k<t; ++k)Shellnsert(L,dlta[k]);  //一趟增量为dlta[k]的插入排序
}//ShellSortvoid ShellInsert(SqList &L,int dk){  //对顺序表L进行一趟增量为dk的Shell排序,dk为步长因子//和一趟直接插入排序相比,做了以下修改://1.前后记录位置的增量是dk,不是1//2.r[0]只是暂存单元,不是哨兵,当j<=0时,插入位置已找到for(i = dk+1; i <= L.length; ++i)  //dk间隔排序,从dk+1开始排序,例如前面讲的一趟直接插入排序从第2个元素开始排序if(r[i].key < r[i-dk].key){  //比前面的大则不需要执行插入操作L.r[0] = L.r[i];  //暂存在L.r[0]for(j = i-dk; j>0 &&(r[0].key < r[j].key); j = j-dk)r[j+dk]=r[j];  //后移L.r[j+dk]=L.r[0];  //插入,退出循环时r[j]<r[0],所以插到L.r[j+dk]的位置}
}

希尔排序的算法效率与增量序列的取值有关。

对于Hibbard增量序列,D_k=2^k-1,相邻元素互质。最坏情况T_{worst}=O(n^{3/2});猜想:T_{avg}=O(n^{5/4})
Sedgewick增量序列{1,5,19,41,109...},D_k=9*4^i-9*2^i+1D_k=4^i-3*2^i+1。猜想:T_{avg}=O(n^{7/6})T_{worst}=O(n^{4/3})

希尔排序法是一种不稳定的排序算法,例如对下面d=2的情况:

总结:对希尔排序来说,时间复杂度是n和d的函数,空间复杂度是O(1),是一种不稳定的排序方法。关于如何选择最佳d序列,目前尚未有解决方案。但是,最后一个增量值必须为1,其他序列元素之间无除了1之外的公因子。此外,希尔排序不宜在链式存储结构上实现。

二. 交换排序

基本思想:两两比较,如果发生逆序则交换,直到所有记录都排好序为止。

常见的交换排序方法:冒泡排序,快速排序。

(1)冒泡排序

给定初始序列:21,25,49,25*,16,08,n=6。

第1趟:
位置0,1进行比较——判断——不交换——结果:21,25,49,25*,16,08

位置1,2进行比较——判断——不交换——结果:21,25,49,25*,16,08

位置2,3进行比较——判断——交换——结果:21,25,25*,49,16,08

位置3,4进行比较——判断——交换——结果:21,25,25*,16,49,08

位置4,5进行比较——判断——交换——结果:21,25,25*,16,08,49

第1趟结束后:21,25,25*,16,08,49
第2趟:

位置0,1进行比较——判断——不交换——结果:21,25,25*,16,08,49

位置1,2进行比较——判断——不交换——结果:21,25,25*,16,08,49

位置2,3进行比较——判断——交换——结果:21,25,16,25*,08,49

位置3,4进行比较——判断——交换——结果:21,25,16,08,25*,49

第2趟结束后:21,25,16,08,25*,49

继续下一趟,每一趟增加一个有序元素。
第3趟结果:21,16,08,25,25*,49

第4趟结果:16,08,21,25,25*,49

第5趟结果:08,16,21,25,25*,49

总结:n个记录,需要比较n-1趟。第m趟需要比较n-m次。

void bubble_sort(SqList &L){  //冒泡排序算法int m,i,j; RedType x;  //交换时临时存储for(m=1; m<=n-1; m++){  //总共需n-1趟for(j=1; j<=n-m; j++)  //第m趟需要比较n-m次if(L.r[j].key > L.r[j+1].key){  //发生逆序x=L.r[j]; L.r[j]=L.r[j+1]; L.r[j+1]=x;  //交换}//endif}//for
}

冒泡排序的优点:每趟结束时,不仅能挤出一个最大值到最后面位置,还能同的部力理顺其他元素。实际上,一旦某一趟比较时不出现记录交换,说明已排好序了,就可以结束本算法。所以我们可以增设一个标识flag:

void bubble_sort(SqList &L){  //改进的冒泡排序算法int m,i,j;flag=1;  //flag作为是否有交换的标记RedType x; for(m=1; m<=n-1 && flag==1; m++){flag=0;for(j=1; j<=n-m; j++){if(L.r[j].key>L.r[j+1].key){//发生逆序flag=1;  //发生交换,flag置为1,若本趟没发生交换,flag保持为零x=L.r[j]; L.r[j]=L.r[j+1]; L.r[j+1]=x;  //交换}//endif}//for}
}

下面分析时间复杂度。最好情况是全为正序,这时比较次数是n-1,移动的次数是0;最坏情况是全为逆序,比较次数是\sum_{i=1}^{n-1}(n-i)=\frac{1}{2}(n^2-n),移动次数是3\sum_{i=1}^{n-1}(n-i)=\frac{3}{2}(n^2-n)(包含向中间辅助变量x移动)。所以,冒泡排序最好时间复杂度是O(n),最坏时间复杂度为O(n^2),平均时间复杂度为O(n^2)。冒泡排序算法中增加一个辅助空间temp,辅助空间为S(n)=O(1),冒泡排序是稳定的排序算法。

(2)快速排序

快速排序是一种改进的交换排序。基本思想是递归思想:任取一个元素(如:第一个)为中心pivot,所有比它小的元素一律前放,比它大的元素一律后放,形成左右两个子表。对各子表重新选择中心元素并依此规则调整,直到每个子表的元素只剩一个(结束条件)。下面的过程,每个表中都选取第一个作为中心点(分界点)。

例如:给定序列

序列共8个数,界点直接取第一个数49,并把它搬到0号位。指针low=1,high=8.由于第1个位置已空,我们从后往前移动high,找一个小于界点的数把它搬到1号位。high--,当high=7的时候,数27满足,把27搬到1号位。此时7位空出来,我们向后移动low,找一个大于界点的数搬到空出来的7号位。low++,当low=3的时候,数65满足,把65搬到7号位,此时3号位空出来。我们再往前移动high,找一个大于界点的数搬到3号位。当high=6,数字13符合,13搬到3号位,6号位又空出。继续往后移动low,low=4,数97符合,97搬到6号位,4号位空出。然后往前移动high,high=5没有符合题意的,继续向前移动至high=4,此时high与low都重合。再把界点49填到4号位。此时8个数字的表就能以4号位49为界分成两个子表:前面1-3位,后面5-8位。然后在对两个子表分别执行相同的操作。

总结:①每一趟的子表的形成是采用从两头向中间交替式逼近法;②由于每趟中对各子表的操作都相似,可采用递归算法。

void main(){QSort(L, 1, L.length);
}void QSort(SqList &L, int low, int high){  //对顺序表L快速排序if(low < high){  //长度大于1pivotloc = Partition(L, low, high);//将L一分为二,pivotloc为中心点元素排好序的位置QSort(L, low, pivotloc-1);  //对低子表递归排序QSort(L, pivotloc+1, high);  //对高子表递归排序}//end if 
}//QSortint Partition(SqList &L, int low, int high){L.r[0] = L.r[low];  //取[low,high]的第一个元素作为中心点,并搬前面去 pivotkey = L.r[low].key;  //这里也是取中心点while (low < high){  //循环终止的条件是low=highwhile (low < high && L.r[high].key >= pivotkey) --high;  //low指针指的地方空出,前移high,直到找到一个小于pivotkey的L.r[low] = L.r[high];  //然后搬到空出的地方low,此时high又空出来while (low < high && L.r[low].key <= pivotkey) ++low;  //high指针指的地方空出,后移low,直到找到一个大于pivotkey的L.r[high] = L.r[low];  //然后搬到空出的地方high,此时low又空出来}L.r[low]=L.r[0];  //退出循环,再把最后指针重合的地方就是空的地方,填回中心点return low;  //返回中心点所在的位置
}

下面分析算法效率:可以证明,时间复杂度是O(nlog_2n),其中对上面的Qsort()是O(log_2n),对下面的Partition()是O(n)。实验结果表明:就平均计算时间而言,快速排序是我们所讨论的所有内排序方法中最好的一个。

接下来分析空间复杂度:快速排序不是原地排序。由于程序中使用了递归,需要递归调用栈的支持,而栈的长度取决于递归调用的深度(即使不用递归,也需要用用户栈)。在平均情况下,需要O(logn)的栈空间;最坏情况下,栈空间可达O(n)。

快速排序同前面的希尔排序,它也是不稳定的排序算法。例如:49,38,49*,20,97,76,经过一次划分后:20,38,49*,49,97,76。

快速排序不适于对原本有序或基本有序的记录序列进行排序。例如,对(46,50,68,74,79,85,90)进行快速排序,会发现:由于每次枢轴记录的关键字都是小于其它所有记录的关键字,致使一次划分之后得到的子序列(1)的长度为0,这时已经退化成为没有改进措施的冒泡排序。

划分元素的选取是影响时间性能的关键。输入数据次序越乱,所选划分元素值的随机性越好,排序速度反而越快,快速排序不是自然排序方法。需要注意的是,改变划分元素的选取方法,至多只能改变算法平均情况的下的世界性能,无法改变最坏情况下的时间性能。即最坏情况下,快速排序的时间复杂度总是O(n^2)。

相关文章:

24.排序,插入排序,交换排序

目录 一. 插入排序 &#xff08;1&#xff09;直接插入排序 &#xff08;2&#xff09;折半插入排序 &#xff08;3&#xff09;希尔排序 二. 交换排序 &#xff08;1&#xff09;冒泡排序 &#xff08;2&#xff09;快速排序 排序&#xff1a;将一组杂乱无章的数据按一…...

Navicat16安装教程

注&#xff1a;因版权原因&#xff0c;本文已去除破解相关的文件和内容 1、在本站下载解压后即可获得Navicat16安装包和破解补丁&#xff0c;如图所示 2、双击“navicat160_premium_cs_x64.exe”程序&#xff0c;即可进入安装界面&#xff0c; 3、点击下一步 4、如图所示勾选“…...

【看表情包学Linux】初识文件描述符 | 虚拟文件系统 (VFS) 初探 | 系统传递标记位 | O_TRUNC | O_APPEND

爆笑教程《看表情包学Linux》&#x1f448; 猛戳订阅&#xff01;​​​​​ &#x1f4ad; 写在前面&#xff1a;通过上一章节的讲解&#xff0c;想必大家已对文件系统基本的接口有一个简单的了解&#xff0c;本章我们将继续深入讲解&#xff0c;继续学习系统传递标志位&…...

ssm+vue“魅力”繁峙宣传网站源码和论文

ssmvue“魅力”繁峙宣传网站源码和论文102 开发工具&#xff1a;idea 数据库mysql5.7 数据库链接工具&#xff1a;navcat,小海豚等 技术&#xff1a;ssm 摘 要 随着科学技术的飞速发展&#xff0c;各行各业都在努力与现代先进技术接轨&#xff0c;通过科技手段提高自身…...

Linux系统编程5(线程概念详解)

线程同进程一样都是OS中非常重要的部分&#xff0c;线程的应用场景非常的广泛&#xff0c;试想我们使用的视频软件&#xff0c;在网络不是很好的情况下&#xff0c;通常会采取下载的方式&#xff0c;现在你很想立即观看&#xff0c;又想下载&#xff0c;于是你点击了下载并且在…...

leetcode645. 错误的集合(java)

错误的集合 题目描述优化空间代码演示 题目描述 难度 - 简单 LC645 - 错误的集合 集合 s 包含从 1 到 n 的整数。不幸的是&#xff0c;因为数据错误&#xff0c;导致集合里面某一个数字复制了成了集合里面的另外一个数字的值&#xff0c;导致集合 丢失了一个数字 并且 有一个数…...

Pytest参数详解 — 基于命令行模式

1、--collect-only 查看在给定的配置下哪些测试用例会被执行 2、-k 使用表达式来指定希望运行的测试用例。如果测试名是唯一的或者多个测试名的前缀或者后缀相同&#xff0c;可以使用表达式来快速定位&#xff0c;例如&#xff1a; 命令行-k参数.png 3、-m 标记&#xff0…...

【python爬虫】3.爬虫初体验(BeautifulSoup解析)

文章目录 前言BeautifulSoup是什么BeautifulSoup怎么用解析数据提取数据 对象的变化过程总结 前言 上一关&#xff0c;我们学习了HTML基础知识&#xff0c;知道了HTML是一种用来描述网页的语言&#xff0c;又了解了HTML的基本结构。 认识了HTML中的常见标签和常见属性&#x…...

【Three.js + Vue 构建三维地球-Part One】

Three.js Vue 构建三维地球-Part One Vue 初始化部分Vue-cli 安装初始化 Vue 项目调整目录结构 Three.js 简介Three.js 安装与开始使用 实习的第一个任务是完成一个三维地球的首屏搭建&#xff0c;看了很多的案例&#xff0c;也尝试了用 Echarts 3D地球的模型进行构建&#xf…...

Power View

界面 切换可视化效果 对于已经上传到透视表的数据&#xff0c;选择power view&#xff0c;形成表格后。...

SQL查询本年每月的数据

--一、以一行数据的形式&#xff0c;显示本年的12月的数据&#xff0c;本示例以2017年为例&#xff0c;根据统计日期字段判断&#xff0c;计算总和&#xff0c;查询语句如下&#xff1a;selectsum(case when datepart(month,统计日期)1 then 支付金额 else 0 end) as 1月, sum…...

C++之struct和union对比介绍

C之struct和union对比介绍 在C中&#xff0c;struct和union都是用来定义自定义数据类型的关键字&#xff0c;但它们的作用略有不同。 首先了解一下它们的基本概念&#xff1a; struct&#xff08;结构体&#xff09;&#xff1a;struct 是一个用户自定义的数据类型&#xff…...

微服务--SkayWalking(链路追踪:国产开源框架)

SkayWalking&#xff1a;分布式系统的应用程序性能监视工具 作用&#xff1a;分布式追踪、性能指标分析、应用、服务依赖分析&#xff1b; SkayWalking性能剖析&#xff1a; 我操&#xff0c;能够定位到某一个方法会有多慢。。。 通过Tid查看全局所有的日志信息&#xff08…...

在Windows 10上部署ChatGLM2-6B:掌握信息时代的智能对话

在Windows 10上部署ChatGLM2-6B&#xff1a;掌握信息时代的智能对话 硬件环境ChatGLM2-6B的量化模型最低GPU配置说明准备工作ChatGLM2-6B安装部署ChatGLM2-6B运行模式解决问题总结 随着当代科技的快速发展&#xff0c;我们进入了一个数字化时代&#xff0c;其中信息以前所未有的…...

LRU和LFU算法的简单实现

LRU #include <iostream> #include <unordered_map> #include <list> struct Node{int key;int value;Node(int key, int value):key(key),value(value){} }; class LruCache{ private:int maxCapacity;// 最大容量std::list<Node>CacheList;// 缓存链…...

OCR多语言识别模型构建资料收集

OCR多语言识别模型构建 构建多语言识别模型方案 合合&#xff0c;百度&#xff0c;腾讯&#xff0c;阿里这四家的不错 调研多家&#xff0c;发现有两种方案&#xff0c;但是大多数厂商都是将多语言放在一个字典里&#xff0c;构建1w~2W的字典&#xff0c;训练一个可识别多种语…...

倍增的经典题目:扩大区间、st表

1. 扩大区间 P4155 [SCOI2015] 国旗计划例题1&#xff1a;P4155 [SCOI2015] 国旗计划 计算能覆盖整个圆圈的最少区间&#xff0c;题目给定的所有区间互相不包含&#xff0c;按区间左端点排序后&#xff0c;区间的右端点也是单增的。 我们首先需要化圆为线&#xff0c;然后贪…...

LeetCode——和为K的子数组(中等)

题目 给你一个整数数组 nums 和一个整数 k &#xff0c;请你统计并返回 该数组中和为 k 的连续子数组的个数 。 示例 1&#xff1a; 输入&#xff1a;nums [1,1,1], k 2 输出&#xff1a;2示例 2&#xff1a; 输入&#xff1a;nums [1,2,3], k 3 输出&#xff1a;2 题解 …...

Truncation Sampling as Language Model Desmoothing

本文是LLM系列文章&#xff0c;针对《Truncation Sampling as Language Model Desmoothing》的翻译。 截断采样作为语言模型的去平滑性 摘要1 引言2 背景3 截断作为去平滑性4 方法5 实验与结果6 相关工作7 结论8 不足 摘要 来自神经语言模型的长文本样本可能质量较差。截断采…...

docker安装jenkins

运行jenkins docker run -d \--name jenkins \ --hostname jenkins \-u root \-p 29090:8080 \--restart always \-v D:\springcloud\学习\jekins\jenkins\jks_home:/var/jenkins_home \ jenkins/jenkins获取root登录密码 密码在jekins_home/secrets/initalAdminPassword文件…...

学习pytorch8 土堆说卷积操作

土堆说卷积操作 官网debug torch版本只有nn 没有nn.functional代码执行结果 B站小土堆视频学习笔记 官网 https://pytorch.org/docs/stable/nn.html#convolution-layers 常用torch.nn, nn是对nn.functional的封装&#xff0c;使函数更易用。 卷积核从输入图像左上角&#xf…...

pytest自动化测试两种执行环境切换的解决方案

目录 一、痛点分析 方法一&#xff1a;Hook方法pytest_addoption注册命令行参数 1、Hook方法注解 2、使用方法 方法二&#xff1a;使用插件pytest-base-url进行命令行传参 一、痛点分析 在实际企业的项目中&#xff0c;自动化测试的代码往往需要在不同的环境中进行切换&am…...

说说TIME_WAIT和CLOSE_WAIT区别

分析&回答 TCP协议规定&#xff0c;对于已经建立的连接&#xff0c;网络双方要进行四次握手才能成功断开连接&#xff0c;如果缺少了其中某个步骤&#xff0c;将会使连接处于假死状态&#xff0c;连接本身占用的资源不会被释放。网络服务器程序要同时管理大量连接&#xf…...

Docker的优势

Docker是一种开源的容器化平台&#xff0c;提供了一种将应用程序、库和其它依赖项封装在容器中的方法。以下是Docker的基本概念和优势&#xff1a; 基本概念&#xff1a; 镜像&#xff1a;一个Docker镜像是一个可运行的软件包&#xff0c;包括应用程序、库和其它依赖项。它是D…...

C++——string使用

string的常见构造接口 string() 构造空的srting类对象&#xff0c;空字符串 string(const char* str) 用字符串初始化 string(const string& str)拷贝构造&#xff0c;使用string类初始化string(size_t n, char c) 用n个字符c初始化 string s1; string s2("hello …...

10. selenium API (二)

目录 1. 多层框架/窗口定位 2. 下拉框处理 2.1 前端界面 2.2 代码 3. 针对 alert 弹窗进行操作 3.1 前端界面 3.2 代码 4. 文件提交 4.1 前端界面 4.2 代码 5. 显示等待 6. 操作浏览器滚动条 7. 截图 8. 浏览器关闭 9. 窗口切换 在上篇文章中&#xff0c;我们学…...

[国产MCU]-W801开发实例-用户报文协议(UDP)数据接收和发送

用户报文协议(UDP)数据接收和发送 文章目录 用户报文协议(UDP)数据接收和发送1、UDP简单介绍2、W801的UDP创建逻辑2.1 UDP使用步骤2.2 代码实现1、UDP简单介绍 用户数据报协议 (UDP) 是一种跨互联网使用的通信协议,用于对时间敏感的传输,例如视频播放或 DNS查找。它通过在数…...

JavaScript 生成 16: 9 宽高比

这篇文章只是对 for 循环一个简单应用&#xff0c;没有什么知识含量。 可以跳过这篇文章。 只是我用来保存一下我的代码&#xff0c;保存在本地我嫌碍眼&#xff0c;总想把他删了。 正文部分 公式&#xff1a;其中 width 表示宽度&#xff0c;height 表示高度 16 9 w i d t…...

HTML5之drawImage函数

参数说明&#xff1a; drawImage(image, x, y) //按原图片大小绘制。 drawImage(image, x, y, width, height) //按指定大小绘制。 drawImage(image, sourceX, sourceY, sourceWidth, sourceHeight, destX, destY, destWidth, destHeight) //常用于图片裁剪。 其中&#xff1a…...

leetcode7.整数反转-Java

题目 给你一个 32 位的有符号整数 x &#xff0c;返回将 x 中的数字部分反转后的结果。 如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1] &#xff0c;就返回 0。 假设环境不允许存储 64 位整数&#xff08;有符号或无符号&#xff09;。 7. 整数反转 - 力扣&a…...