排序学习整理(1)
1.排序的概念及运用
1.1概念
排序:所谓排序,就是使⼀串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作,以便更容易查找、组织或分析数据。
1.2运用
购物筛选排序
院校排名
1.3常见排序算法
2.实现常见排序算法
int a[] = {5, 3, 9, 6, 2, 4, 7, 1, 8};
2.1 插入排序
把待排序的记录按其关键码值的大小逐个插入到⼀个已经排好序的有序序列中,直到所有的记录插入完为止,得到⼀个新的有序序列 。
2.1.1 直接插入排序
直接插入排序(Direct Insertion Sort)是一种简单直观的排序算法,它通过逐步构建有序序列,将未排序部分的元素插入到已排序部分的适当位置,直到整个数组排序完成。
基本思想
1.将数组分为 已排序部分 和 未排序部分。
初始时,已排序部分只有第一个元素。
未排序部分为剩余的元素。
2.依次从未排序部分取出一个元素,插入到已排序部分的正确位置。
3.重复以上操作,直到未排序部分为空。
算法步骤
1.从数组的第二个元素(索引为 1)开始,依次向后遍历。
对当前元素,在已排序部分从后向前查找其插入位置:
如果已排序部分的元素大于当前元素,则将其向后移动。
2.找到插入位置后,将当前元素放入。
3.重复此过程,直到所有元素排序完成。

代码实现
void InsertSort(int* a, int n) {for (int i = 1; i < n; i++) {// 当前要插入的元素int tmp = a[i];// 已排序部分的最后一个元素的索引int j = i - 1;// 从后向前查找插入位置while (j >= 0 && a[j] > tmp) {a[j + 1] = a[j]; // 后移元素j--;}// 将当前元素插入到正确的位置a[j + 1] = tmp;}
}
特性总结
算法复杂度
- 时间复杂度:
- 最坏情况(数组逆序):
O(n^2)
- 最好情况(数组已排序):
O(n)
- 平均情况:
O(n^2)
- 最坏情况(数组逆序):
- 空间复杂度:原地排序,不需要额外的辅助空间,空间复杂度为
O(1)
。 - 稳定性:直接插入排序是稳定的,因为在插入过程中不会改变相等元素的相对顺序。
优缺点
优点:
- 简单直观:实现容易,适合小规模数据。
- 性能良好:当数组接近有序时,插入排序的效率很高,接近
O(n)
。
缺点:
- 效率低下:对大规模、随机分布的数组排序效率较低,时间复杂度较高。
- 大量数据移动:当数组逆序时,几乎每次插入都需要移动大量元素。
适用场景
- 数据量较小(如
n <= 100
)时,插入排序是一种简单有效的选择。 - 数据本身接近有序时(如几乎按升序排列),插入排序效率很高。
2.1.2 希尔排序
希尔排序又称缩小增量法,是一种基于插入排序的改进算法,得名于其发明者 Donald Shell。它通过分组和逐步缩小分组间距(增量),使得数据能够更快地接近有序,从而提高排序效率。
基本思想
先选定⼀个整数(通常是
gap = n/3 + 1
),把待排序文件所有记录分成各组,所有的距离相等的记录分在同⼀组内,并对每⼀组内的记录进⾏排序,然后gap = gap/3 + 1
得到下⼀个整数,再将数组分成各组,进入插入排序,当gap = 1
时,就相当于直接插入排序。它是在直接插入排序算法的基础上进行改进而来的,综合来说它的效率肯定是要高于直接插入排序算法的。
算法步骤
- 初始化
gap = n / 3 + 1
,其中n
是数组的长度。 - 按照当前的
gap
将数组分组,对每组进行插入排序。 - 缩小
gap
,继续分组排序,直到gap = 1
。 - 当
gap = 1
时,进行最后一次插入排序,数组有序。
代码实现
void ShellSort(int* a, int n) {int gap = n;// 缩小增量,直到 gap == 1while (gap > 1) {gap = gap / 3 + 1;// 分组for (int group = 0; group < gap; group++) { // 控制每组// 每组独立进行插入排序for (int i = group + gap; i < n; i += gap) {int tmp = a[i];int j = i - gap;while (j >= group && a[j] > tmp) {a[j + gap] = a[j];j -= gap;}a[j + gap] = tmp;}}}
}
显式地将数组分组,每组独立排序后再继续调整增量 gap,
这种更好理解分组排序的原理,但代码稍显冗长,所以我一般用这种
void ShellSort1(int* a, int n) {int gap = n;// 缩小增量,直到 gap == 1while (gap > 1) {gap = gap / 3 + 1;// 从 gap 开始,模拟插入排序for (int i = gap; i < n; i++) {int tmp = a[i]; // 当前待插入的元素int j = i - gap;// 插入排序逻辑,按 gap 步长比较和移动while (j >= 0 && a[j] > tmp) { // 在同组中向前查找a[j + gap] = a[j]; // 将较大的元素后移j -= gap; // 按 gap 步长继续比较}a[j + gap] = tmp; // 插入到合适位置}}
}
这种方法也叫“简单希尔排序”(Simple Shell Sort),或者直接叫并着走,它直接在外层控制增量 gap
,然后在整个数组中按步长进行插入排序,逻辑比较直观,效率高。这种实现方法更贴近希尔排序的本质,适合直接应用于实际场景。
它的核心思想是
希尔排序的分组本质上是用 步长
gap
控制哪些元素属于一个组。
- 在并着走的实现中,假设
gap = 3
:
- 对于索引为
0, 3, 6, 9...
的元素,它们属于第一组。- 对于索引为
1, 4, 7, 10...
的元素,它们属于第二组。- 对于索引为
2, 5, 8, 11...
的元素,它们属于第三组。- 并着走的逻辑是遍历整个数组,隐式地让这些组在同一个循环中排序。
在
gap
的控制下:
- 每个位置
i
的元素a[i]
,都会和同组的前一个元素(位置i - gap
)进行比较。- 如果需要交换位置,就不断向前检查,直到找到合适位置。
特性总结
算法复杂度
1.时间复杂度:
最坏情况:O(n^2)
(不理想的增量序列)。
平均情况:O(n^(3/2))
或更优(根据增量序列)。
最好情况:接近 O(n)
。
可以分成内外层来分析
外层循环(控制增量 gap):应该能直接看出来吧,无疑问的O(log(n)),就是增量序列的长度。
内层循环(分组插入排序):
- 当gap为n / 3时,移动总数为: n / 3 * (1 + 2) = n
- 当gap为n / 9时,移动总数为: n / 9 * (1 + 2 + 3 + .... + 8) = (n / 9) * (8 (1 + 8) / 2)= 4n
- 最后⼀趟,gap=1,即直接插入排序,内层循环排序消耗为n
可知,比较次数是先增加再下降的,或者画一张曲线图更好理解
因此,希尔排序在最初和最后的排序的次数都为n,即前⼀阶段排序次数是逐渐上升的状态,当到达某⼀顶点时,排序次数逐渐下降至n,而该顶点的计算暂时无法给出具体的计算过程
2.空间复杂度:使用原地排序,额外空间复杂度为 O(1)
。
3.稳定性:不稳定,因为在分组时可能会打乱相同元素的相对顺序。
优缺点
优点:
- 简单易实现。
- 对中等规模的数组(如 1 万以下)性能较好。
- 在基本有序的数组上效率较高。
缺点:
- 不稳定,不能保证相同元素的顺序。
- 对非常大的数组,效率不如快速排序。
增量序列的选择
- 希尔增量:
gap = gap / 3 + 1
。 - Hibbard增量:
gap = 2^k - 1
。 - Sedgewick增量:
gap = 9 * 4^i - 9 * 2^i + 1
等。 - 增量序列的选择会显著影响希尔排序的性能。
适用场景
- 数据规模适中(几百到几万)。
- 数据分布无规律,但需要排序效率较高的场景。
- 对性能要求高,但稳定性不重要的场景。
2.2 选择排序
每⼀次从待排序的数据元素中选出最小或最大的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完 。
2.2.1 直接选择排序
直接选择排序(Selection Sort)是一种简单的排序算法,其基本思想是每次从待排序的序列中选择最小(或最大)元素,将其放到已排序序列的末尾。该算法属于交换排序类,通过多次选择最小(或最大)元素并与当前序列中的元素交换来逐步完成排序。
基本思想
- 选择最小元素:在每一轮中,找到剩余未排序部分的最小元素。
- 交换位置:将找到的最小元素与当前已排序部分的末尾元素交换位置。
- 重复:每次排好一个元素后,缩小待排序部分的范围,继续执行选择和交换操作,直到所有元素排序完成。
算法步骤
- 假设数组长度为
n
,开始时将整个数组看作未排序部分。 - 从第一个元素开始,扫描剩余部分,找到最小的元素。
- 将最小元素与当前待排序部分的第一个元素交换。
- 重复此过程,直到排序完成。

代码实现
void SelectionSort(int* a, int n) {// 外层循环控制已排序部分的末尾for (int i = 0; i < n - 1; i++) {int minIndex = i;// 内层循环在未排序部分中寻找最小值for (int j = i + 1; j < n; j++) {if (a[j] < a[minIndex]) {minIndex = j; // 记录最小元素的索引}}// 交换最小元素与当前已排序部分的下一个元素if (minIndex != i) {int temp = a[i];a[i] = a[minIndex];a[minIndex] = temp;}}
}
特性总结
算法复杂度
1.时间复杂度:
最坏情况(数组逆序):O(n^2)
最好情况(数组已排序):O(n^2)
(即数组已经排序,选择排序仍需执行完整的循环)
平均情况:O(n^2)
2.空间复杂度:原地排序:不需要额外的辅助空间,空间复杂度为 O(1)
。
3.稳定性:不稳定:在排序过程中可能会改变相等元素的相对顺序,因为会交换位置。
优缺点
优点:
- 简单直观:直接选择排序算法的实现简单,易于理解,适合小规模数据。
- 空间效率高:只使用常数级的额外空间,内存开销小。
缺点:
- 效率低下:由于时间复杂度为
O(n^2)
,对于大规模数据,性能较差。 - 不稳定:相同元素的顺序可能被改变,导致排序不稳定。
- 交换次数较多:每次找到最小元素后都会交换,可能导致不必要的交换操作。
适用场景
- 数据量较小(如
n <= 100
)时,选择排序是一种简单有效的排序方法,适合小规模数据的排序。 - 数据本身接近有序时,直接选择排序的性能相对较好,尽管时间复杂度为
O(n^2)
,但相较于其他O(n^2)
算法,选择排序的交换次数较少。
2.2.2 堆排序
堆排序(Heap Sort)是一种基于堆数据结构的排序算法,堆是一种完全二叉树,满足堆的性质:
- 最大堆(Max Heap):父节点的值大于或等于其子节点的值,根节点是最大元素。
- 最小堆(Min Heap):父节点的值小于或等于其子节点的值,根节点是最小元素。
堆排序利用堆的性质,每次从堆中提取根节点(最大或最小),然后调整堆结构,从而实现排序。
基本思想
- 构建堆:将待排序数组转换成一个堆结构(可以是最大堆或最小堆),通常构建最大堆。
- 交换根节点与最后一个节点:将堆顶(最大元素)与堆的最后一个元素交换,这样最大元素就被放置到了正确的位置。
- 调整堆:交换后,堆的结构可能被破坏,需要重新调整堆,使其恢复堆的性质。
- 重复:将剩下的部分继续调整为堆,再次进行交换,直到所有元素都排序完成。
算法步骤
- 建堆:将给定的数组转换成一个最大堆。
- 交换根节点和最后一个节点:把堆顶元素(最大值)交换到数组的末尾。
- 调整堆:将剩余部分重新调整为最大堆。
- 重复交换和调整过程,直到堆的大小减小为1。
代码实现
#include <stdio.h>// 调整堆结构
void AdjustDown(int* a, int n, int parent) {int child = parent * 2 + 1; // 左子节点的索引while (child < n) {// 如果有右子节点,且右子节点更大,则选择右子节点if (child + 1 < n && a[child + 1] > a[child]) {child++;}// 如果父节点小于最大子节点,则交换if (a[child] > a[parent]) {int temp = a[parent];a[parent] = a[child];a[child] = temp;parent = child;child = parent * 2 + 1; // 继续向下调整} else {break; // 如果父节点大于等于最大子节点,则结束}}
}// 堆排序主函数
void HeapSort(int* a, int n) {// 建堆(从最后一个非叶子节点开始调整堆)for (int i = (n - 1) / 2; i >= 0; --i) {AdjustDown(a, n, i);}// 交换根节点(最大元素)和最后一个元素,然后调整堆int end = n - 1;while (end > 0) {// 交换根节点与堆的最后一个元素int temp = a[0];a[0] = a[end];a[end] = temp;// 重新调整堆AdjustDown(a, end, 0);--end;}
}// 打印数组
void PrintArray(int* a, int n) {for (int i = 0; i < n; ++i) {printf("%d ", a[i]);}printf("\n");
}int main() {int arr[] = {4, 10, 3, 5, 1};int n = sizeof(arr) / sizeof(arr[0]);HeapSort(arr, n);PrintArray(arr, n);return 0;
}
堆排序的步骤演示
假设我们有一个数组 [4, 10, 3, 5, 1]
,我们来逐步演示堆排序的过程。
1.建堆:首先将数组转换为最大堆:
AdjustDown
会从最后一个非叶子节点开始,调整堆结构。
经过调整,最大堆应该是 [10, 5, 3, 4, 1]
。
2.交换根节点和最后一个元素:交换根节点 10 和数组末尾的元素 1,得到 [1, 5, 3, 4, 10]
。
通过 AdjustDown
调整堆,使其重新恢复堆的性质,得到 [5, 4, 3, 1, 10]
。
3.再次交换根节点和最后一个元素:交换根节点 5 和倒数第二个元素 1,得到 [1, 4, 3, 5, 10]
。
通过 AdjustDown
调整堆,得到 [4, 1, 3, 5, 10]
。
4.重复:继续交换并调整堆,直到整个数组排好序:
交换后得到 [3, 1, 4, 5, 10]
。
调整后得到 [3, 1, 4, 5, 10]
。
最终得到排序结果 [1, 3, 4, 5, 10]
。
特性总结
算法复杂度
1.时间复杂度:
最坏情况(数组逆序):O(n log n)
最好情况(数组已排序):O(n log n)
平均情况:O(n log n)
2.空间复杂度:原地排序:堆排序不需要额外的辅助空间,空间复杂度为 O(1)
。
3.稳定性:不稳定:堆排序在排序过程中可能改变相等元素的相对顺序,因此是一个不稳定的排序算法。
优缺点
优点:
- 时间复杂度稳定:无论在最坏、最好还是平均情况下,堆排序的时间复杂度始终为
O(n log n)
,表现稳定。 - 原地排序:堆排序只使用常数级额外空间,空间复杂度为
O(1)
,内存开销小。 - 适用于大规模数据:由于堆排序的时间复杂度较为稳定,因此适合用于处理大规模数据的排序任务。
缺点:
- 不稳定:堆排序不保持相等元素的相对顺序,因此不适用于需要稳定排序的场景。
- 常数因子较大:虽然时间复杂度为
O(n log n)
,但堆排序的常数因子较大,通常会比其他如快速排序的实际性能稍差。
适用场景
- 大规模数据的排序:堆排序在处理大数据时较为稳定,尤其是在对时间复杂度有较高要求时。
- 内存有限的情况:堆排序是原地排序,不需要额外的内存,适用于内存受限的情况。
- 需要稳定时间复杂度的场景:当不关心排序的稳定性时,堆排序是一个不错的选择,尤其是在无法预测输入数据分布的情况下。
下一章应该是介绍冒泡和快速排序(
那几种快速排序够写很多了(
相关文章:

排序学习整理(1)
1.排序的概念及运用 1.1概念 排序:所谓排序,就是使⼀串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作,以便更容易查找、组织或分析数据。 1.2运用 购物筛选排序 院校排名 1.3常见排序算法 2.实…...
《深入探究 Java 中的 boolean 类型》
在 Java 编程语言的世界里,boolean 类型虽然看似简单,却在程序的逻辑控制和决策中起着至关重要的作用。本文将带你深入了解 Java 中的 boolean 类型,从其基本概念、用法到实际应用场景,以及一些常见的注意事项。 一、boolean 类型…...
智享 AI 自动无人直播系统:打破地域与时间枷锁中小微企业的营销破局利器
中小微企业,在商业浪潮中恰似逐浪扁舟,常面临营销成本高、推广渠道窄、专业人才缺等 “暗礁”,而智享 AI 自动无人直播系统恰如精准导航的灯塔,助其破浪前行、突出重围。 成本维度,传统直播人力成本让中小微企业望而却…...

接口测试工具:reqable
背景 在众多接口测试工具中挑选出一个比较好用的接口测试工具。使用过很多工具,如Postman、Apifox、ApiPost等,基本上是同类产品,一般主要使用到的功能就是API接口和cURL,其他的功能目前还暂未使用到。 对比 性能方面ÿ…...

同时多平台git配置:GitHub和Gitee生成不同的SSH Key
文章目录 GitHub和Gitee生成不同的SSH Key步骤1:生成SSH Key步骤2:配置SSH配置文件步骤3:查看SSH公钥步骤4:将SSH公钥添加到GitHub和Gitee步骤5:测试SSH连接步骤6:添加remote远程库 GitHub和Gitee生成不同的…...

刷题计划day24 回溯(三)【复原 IP 地址】【子集】【子集 II】
⚡刷题计划day24 回溯(三)继续,回溯一共会有五个专题,敬请期待关注,可以点个免费的赞哦~ 往期可看专栏,关注不迷路, 您的支持是我的最大动力🌹~ 目录 题目一:复原 IP…...

从“找三角形”讲“等腰三角形”
【题目】 周长为11,且各边长均为整数的三角形有哪些? 【答案】 四种,边长分别为: 2 4 5 3 3 5 1 5 5 3 4 4 【解析】 讲解等腰三角形的概念时,传统方法一般向学生展示一个等腰三角形的实物模型,这…...
Java中的泛型方法和泛型类
在Java编程语言中,泛型(Generics)是一个强大的特性,它使得类、接口和方法能够灵活地操作各种数据类型,同时保持类型安全。泛型主要通过类型参数(Type Parameters)来实现,这些类型参数…...
springboot学习-spring-boot-data-jdbc分页/排序/多表查询的例子
上次使用的是JdbcTemplate实现的,是比较老的方式,重新用spring boot data jdbc和jdbc client 实现一遍。也比较一下这几种的编码差异。数据库方面JAVA给了太多选择,反而不好选了。 上次就试图直接用: public interface UserRepo…...

通信与网络基础
1.网络通信基本概念 通信:人、物通过某种介质和行为进行信息传递与交流 网络通信:终端设备之间通过计算机网络进行通信 两个终端通过网线传递文件 多个终端通过路由器传递文件 终端通过Internet下载文件 2.信息传递过程 图1-1 假定A计算机访问B的web…...
【3.存储系统】综合大题
【考点】存储系统综合大题 【2011年408真题】某计算机存储器按字节编址,虚拟(逻辑)地址空间大小为16 MB,主存(物理)地址空间大小为1 MB,页面大小为4 KB;Cache采用直接映射方式,共8行;主存与Cache之间交换的…...

【Linux】【字符设备驱动】深入解析
Linux字符设备驱动程序用于控制不支持随机访问的硬件设备,如串行端口、打印机、调制解调器等。这类设备通常以字符流的形式与用户空间程序进行交互。本节将深入探讨字符设备驱动的设计原理、实现细节及其与内核其他组件的交互。 1. 引言 字符设备驱动程序是Linux内…...

【JavaEE】多线程(2)
一、线程安全 1.1 线程安全的概念 线程是随机调度执行的,如果多线程环境下的程序运行的结果符合我们预期则说明线程安全,反之,如果遇到其他结果甚至引起了bug则说明线程不安全 1.2 经典例子与解释 下面举一个经典的线程不安全的例子&…...

mac下Gpt Chrome升级成GptBrowser书签和保存的密码恢复
cd /Users/自己的用户名/Library/Application\ Support/ 目录下有 GPT\ Chrome/ Google/ GptBrowser/ GPT\ Chrome 为原来的chrome浏览器的文件存储目录. GptBrowser 为升级后chrome浏览器存储目录 书签所在的文件 Bookmarks 登录账号Login 相关的文件 拷贝到GptBrow…...

使用Grafana K6来测测你的系统负载能力
背景 近期我们有个号称会有很高很高并发的系统要上线,为了测试一下自己开发的系统的负载能力,准备了点海克斯科技,来看看抗不抗的住。 之前笔者写过用Apache JMeter进行压力测试的文章(传送门👉:https://…...

【论文复现】基于BERT的语义分析实现
📝个人主页🌹:Eternity._ 🌹🌹期待您的关注 🌹🌹 ❀ WRN: 宽度残差网络 概述语义分类文本分类情感分类 实现原理 核心逻辑pre_deal.pytrain.pytest_demo.py 实现方式&演示效果训练阶段测试阶…...
CTF-RE: STL逆向 [NewStarCTF 2023 公开赛道 STL] WP
多看看STL题就会了,很简单 int __fastcall main(int argc, const char **argv, const char **envp) {__int64 v3; // rbx__int64 v4; // raxchar v5; // bl_BYTE *v6; // rax_QWORD *v7; // rax__int64 v8; // rax__int64 v9; // raxint i; // [rsp0h] [rbp-250h]int j; // [r…...
实习冲刺第三十六天
46.全排列 给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。 示例 1: 输入:nums [1,2,3] 输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]示例 2: 输入&#…...

【Zemax光学设计实训三】---激光缩束镜的设计优化
前言与目录 技术设计要求: 设计一个激光扩束镜,使用的波长为1064nm,输入光束直径为10mm,输出光束的直径为2mm,且输入光束和输出光束平行(即平行光入射,平行光出射)。要求只使用两片…...

TCP/IP协议簇自学笔记
摘抄于大学期间记录在QQ空间的一篇自学笔记,当前清理空间,本来想直接删除掉的,但是感觉有些舍不得,因此先搬移过来。 曾经,我只知道socket函数能进行网络间数据的通信,知道tcp/ip协议也是用来进行网络数据…...

Linux应用开发之网络套接字编程(实例篇)
服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...

多模态2025:技术路线“神仙打架”,视频生成冲上云霄
文|魏琳华 编|王一粟 一场大会,聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中,汇集了学界、创业公司和大厂等三方的热门选手,关于多模态的集中讨论达到了前所未有的热度。其中,…...

stm32G473的flash模式是单bank还是双bank?
今天突然有人stm32G473的flash模式是单bank还是双bank?由于时间太久,我真忘记了。搜搜发现,还真有人和我一样。见下面的链接:https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...
<6>-MySQL表的增删查改
目录 一,create(创建表) 二,retrieve(查询表) 1,select列 2,where条件 三,update(更新表) 四,delete(删除表…...
STM32+rt-thread判断是否联网
一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...
【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)
要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况,可以通过以下几种方式模拟或触发: 1. 增加CPU负载 运行大量计算密集型任务,例如: 使用多线程循环执行复杂计算(如数学运算、加密解密等)。运行图…...
聊一聊接口测试的意义有哪些?
目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开,首…...

tree 树组件大数据卡顿问题优化
问题背景 项目中有用到树组件用来做文件目录,但是由于这个树组件的节点越来越多,导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多,导致的浏览器卡顿,这里很明显就需要用到虚拟列表的技术&…...

零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)
本期内容并不是很难,相信大家会学的很愉快,当然对于有后端基础的朋友来说,本期内容更加容易了解,当然没有基础的也别担心,本期内容会详细解释有关内容 本期用到的软件:yakit(因为经过之前好多期…...
Caliper 负载(Workload)详细解析
Caliper 负载(Workload)详细解析 负载(Workload)是 Caliper 性能测试的核心部分,它定义了测试期间要执行的具体合约调用行为和交易模式。下面我将全面深入地讲解负载的各个方面。 一、负载模块基本结构 一个典型的负载模块(如 workload.js)包含以下基本结构: use strict;/…...