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

从入门到精通数据结构----四大排序(上)

目录

首言:

 1. 插入排序

  1.1 直接插入排序

  1.2 希尔排序

2. 选择排序 

 2.1 直接选择排序  

  2.2 堆排序

3. 交换排序

  3.1 冒泡排序

  3.2 快排 

 结尾:

首言:

    本篇文章主要介绍常见的四大排序:交换排序、选择排序、插入排序、归并排序。上主要介绍前三种。由常见的时间复杂度较大的,再到复杂到较小的比较难的排序。由浅入深,层层递进,实现对排序的深刻理解.

 1. 插入排序

  1.1 直接插入排序

      实现简单的插入排序,需要我们首先进行单趟的排序。其基本思想为:故名思意就是将尾部最后面位置的数插入到比他大的数的前面,并将大的数据向后移动。方法为:找到尾部的值定义为 end + 1,前面的值为 end , 然后进行判断的比较。

     单趟排序实现的代码为将 end 赋值为 n - 2,之后先前进行比较。

void Part_InitSort(int* a, int n)//a 表示一个数组,n 表示这个数组的大小
{//进行单趟的排序,找到末尾位置int end = n - 2;//使它指向数组的倒数第二个int tmp = a[end + 1];while (end >= 0){if (tmp < a[end]){a[end + 1] = a[end];end--;}else{break;}}//当遇到小于 tmp 的值的时候跳出循环,并且将 end + 1 的位置放上 tmp。a[end + 1] = tmp;
}

    之后将单趟排序放入到整个的排序之中去,从第一个位置开始(先进行比较前面的两个数字),记录它的下标放到 tmp 里面如果是 tmp 小的话就进行移动。直到这个 n 表示的后面的倒数第二个的时候,实现全部的排序。进行替换的时候循环结束的条件为到 end 减到 0 为止。

void InitSort(int* a, int n)
{//利用单趟插入的排序的想法,进行一个循环的排序int i = 0;for (i = 0; i < n - 1; i++){//从前两个位置开始int end = i;int tmp = a[end + 1];while (end >= 0){if (tmp < a[end]){a[end + 1] = a[end];end--;}else{break;}}a[end + 1] = tmp;}
}

  1.2 希尔排序

    由于直接插入排序的时间复杂度非常的高。对其进行优化,现在给出这样一个变量 grap 进行划分,不在一个一个的比较,直接比较相差 grap 个数之后的数进行比较(进行预排),使用预排序可以实现使整个数组,实现接近有序,从而大大减少直接插入排序的次数。如图所示。 

void ShellSort(int* a, int n)
{//首先我们先不考虑 grap 的大小,假设为 3, 就是相当于将前面的位置的 1 换成了 grapint grap = 3;for (int i = 0; i < n - grap; i++){int tmp = a[i + grap];int end = i;while (end >= 0){if (tmp < a[end]){a[end + grap] = a[end];end -= grap;}else{break;}}a[end + grap] = tmp;}//接下来就是对于 garp 的范围进行确定。 
}

    经过大量的实践得到了:当每次 grap = grap / 3 (grap = n);进行的预排序时间复杂度是最好的。

    进行 grap 的选择的时候具有:如果 grap 很大但是跳的很快,但是越不接近有序的特点。所以当不断缩小空间的时候,由于前面的铺垫,会让后面范围小的插入排序进行次数减少。但是希尔排序也具有不稳定的特点。 

    希尔排序进行结束的条件是grap < 1,因为最后一次执行的就是直接插入排序,但是因为接近有序了,所以需要的次数非常的少。

void ShellSort(int* a, int n)
{//进行一次的希尔排序,并不是已经排序好的,是需要不断地去缩小空间,实现排序//int grap = n;while (grap > 1){grap = (grap / 3) + 1;// + 1 是为了保证最后一次始终有 1 for (int i = 0; i < n - grap; i++){int tmp = a[i + grap];int end = i;while (end >= 0){if (tmp < a[end]){a[end + grap] = a[end];end -= grap;}else{break;}}a[end + grap] = tmp;}}
}

2. 选择排序 

 2.1 直接选择排序  

     基本思想:定义一个 tmp(用来进行遍历),每次都从第一个位置开始,到 end 结束,如果是a[tmp]大于定义的最大的内个,就将 tmp 赋值给最大的那个下标(小的也一样)。找到最大的最小的那个之后,进行交换,交换的时候最小的交换到第一个位置,最小的交换到最后位置。随后进行 end--,begin++。在进行下一步操作。

     注意选择排序的交换的是带有下标的数组元素,不是直接的替换(直接替换的话,会造成数据的串改)。下面这个串代码包括了选择排序与交换函数。

void SelectSort(int* a, int n)
{assert(a);int begin = 0, end = n - 1, i = 0;for (i = begin; i <= end; i++){//需要寻找的是下标int mini = begin, maxi = end;int tmp = begin;for (tmp = begin + 1; tmp <= end; tmp++){if (a[tmp] > a[maxi]){maxi = tmp;}if (a[tmp] < a[mini]){mini = tmp;}}//在同时进行寻找 最大 与 最小 的时候可能会有最大值在第一个位置的情况.//最小值在开始位置时,这不影响。但是最大值在一开始位置就影响。Swap(&a[begin], &a[mini]);//交换了之后,mini 位置 存放的是最大值if (begin == maxi){maxi = mini;}Swap(&a[maxi], &a[end]);end--;begin++;}
}
void Swap(int* a, int* b)
{int* tmp = a;*a = *tmp;*b = *tmp;
}

  2.2 堆排序

    堆排序就是通过建立堆,来进行排序。升序建立建大堆,降序建小堆。 建堆的话需要进行向下调整算法实现大(小)堆。

   1.向下调整算法(以建立大堆为例):要求左右子树都是小堆,才可以使用向下调整算法。原理是:通过父亲结点跟左右孩子节点进行比较,如果是孩子比父亲大,就需要进行交换,接着向下走。直到父亲结点比所有的孩子都大的时候就停止。

    2.细节:循环结束的条件是,child == n,因为识别的是数组的下标所有的大小都是 n - 1。其次,跟新完父亲结点之后的孩子结点也是需要更新的最后的退出条件为当父亲节点比所有的孩子结点都要大的时候,就跳出循环,表示大堆已经建立。

void AdjustDown(int* a, int n, int parent)
{int Child = parent * 2 + 1;//找到左孩子.//当孩子不小于n就停止while (Child < n){if (Child + 1 < n && a[Child] < a[Child + 1])//找到孩子里面最大的一个{Child += 1;}if (a[parent] < a[Child]){Swap(&a[parent], &a[Child]);parent = Child;Child = parent * 2 + 1;}else//因为下面的就都是符合条件的,不需要在进行向下调整.{break;}}
}

2.通过这个算法,在底部从下往上开始进行排序,实现大堆的建立。建立完大堆之后将第一个位置的值放到最后一个位置。排序 n - 1个数。

注意事项:1.建立大堆是需要从最后一个父亲结点,向前进行向下调整算法。2. 注意 i 的范围是从 (n - 1 - 1)/ 2开始的 . 3. 下一次进来的时候,是去排序 end  个数字。

//堆排序的时间复杂度为 n * log(n)
void HeapSort(int* a, int n)
{//堆排序,建立升序用大堆。所以需要一个向下调整函数。//1.首先先建立一个大堆.int i = 0;for (i = (n - 1 - 1) / 2; i >= 0; i--){AdjustDown(a, n, i);}//2.将第一个位置的最大值,放到堆的最后int end = n - 1;while (end >= 0){Swap(&a[0], &a[end]);AdjustDown(a, end, 0);end--;}	
}

3. 交换排序

  3.1 冒泡排序

    冒泡排序是最简单的交换排序,从第一个位置开始向后进行一次交换,直到找到了不符合条件的那个数字,就停止。

    注意实现:i 表示的是进行多少次的交换,主要看的是的 j ,每次都是从 0,第一个位置开始进行计算,比较的是两个数字,所以是 n - 1,但是每次当放到最后的一个位置的时候,会少一个数字,所以每次都要- i;

void BubbleSort(int* a, int n)
{assert(a);int i = 0, j = 0;for (i = 0; i < n ; i++){for (j = 0; j < n - 1- i; j++){if (a[j] > a[j + 1]){Swap(&a[j], &a[j + 1]);}}}
}

  3.2 快排 

     快速排序是经常会考到,他的主要做法为定义 begin 和 end(倒数第二个数字),最后一个数字 key,begin 去找到比 key 大的数然后停下来,end 去找比 key 小的数然后停下来。之后再进行交换比 key 大的值,与比 key 小的值。当 begin = end 的时候将 key 放到这个位置。

1. 首先先实现单趟的排序。

//函数的left 与 right 区间为;[left, right]
int PartSort1(int* a, int left, int right)
{//选择一个 key,我选择的是最后的位置,所以就需要让 left 进行先走int key = a[right];while (left < right){//左边 去寻找最大的while (left < right && a[left] <= key){left++;}//右边 去寻找最小的while (left < right && a[right] >= key){right--;}//每次进行寻找,找到了 left 指向了较大的, right 指向较小的。就进行交换Swap(&a[left], &a[right]);}//结束循环时表示 left 与 left 相遇到了一起。随便与 k 进行交换可。Swap(&a[key], &a[right]);return left;//叫替换了的位置返回,方便后续进行拆分
}

2. 通过单趟排序,实现整体的快速排序。主要思想是:通过递归让左右都实现有序,不断的向下分直到不能分为止,也就是只有一个数,left 跟 right 都是在一起的时候,表明这个一段数组是有序的。 

void QuickSort(int* a, int left, int right)
{//每次都进行循环,结束条件为左指针遇上了右指针.if (left >= right){return;}//每次递归都划分为两个区域,left - div - 1,div + 1 - right;int div = PartSort2(a, left, right);//进行左边的排序QuickSort(a, left, div - 1);QuickSort(a, div + 1, right);
}

3. 细节:(1) 选定后面的值一定是从最前面的开始进行计算。因为前面去找的是最大的值,需要将最大的值放到后面,如果是右边先走的话,就不是将最小的值放到后面,因此 div 的右边就不是都大于 div 的。 

 (2) 当最后一次进行交换的时候会将 key 位置放到想要的位置,它的前面都是小于 key 的,后面都是大于 key 的。

(3) 其次当对于一个有序的数组直接的进行排序的话复杂度非常的高为:O(n2),所以需要进行取中间值,避免最后取到 key 的是极值的情况。这个取中间值的方法只要是运用在了进行部分的快速排序算法当中去。让 key 位置是保证为中间值,不是极值。

int MidInit(int* a, int begin, int end)
{int mid = (begin + end )/2;if (a[begin] > a[mid]){if (a[begin] < a[end]){return begin;}else if (a[mid] > a[end]){return mid;}else{return end;}}else //这种情况表示的是 a[begin] < a[mid]{if (a[begin] > a[end]){return begin;}else if (a[mid] > a[end]){return mid;}else{return end;}}
}

(4) 快速排序,还有另外的两种方法:挖坑法前后指针法,以及再进行优化。这个一节我放到下一篇文章中进行讲解。

 结尾:

     如果对你有帮助还请帮我点个免费的赞,支持一下我,我也会不断地改进争取写出跟高质量的文章。我们共同努力!!!!😊😊😊

相关文章:

从入门到精通数据结构----四大排序(上)

目录 首言&#xff1a; 1. 插入排序 1.1 直接插入排序 1.2 希尔排序 2. 选择排序 2.1 直接选择排序 2.2 堆排序 3. 交换排序 3.1 冒泡排序 3.2 快排 结尾&#xff1a; 首言&#xff1a; 本篇文章主要介绍常见的四大排序&#xff1a;交换排序、选择排序、插入排序、归并排…...

数据结构-堆的实现和应用

目录 1.堆的概念 2.堆的构建 3.堆的实现 4.堆的功能实现 4.1堆的初始化 4.2堆的销毁 4.3堆的插入 4.3.1向上调整 4.4堆的删除 4.4.1向下调整法 ​编辑4.5取堆顶 5. 向上调整法和向下调整法比较 6.堆的应用 6.1TOP-K问题 6.2TOP-K思路 6.2.1用前n个数据来建堆 6.…...

Spring MVC

1. 用户发起请求 用户行为&#xff1a;用户在浏览器中输入URL或点击链接&#xff0c;向Web服务器&#xff08;如Tomcat&#xff09;发起一个HTTP请求。请求传输&#xff1a;请求被发送到Web容器&#xff0c;Web容器根据配置将请求转发给DispatcherServlet。 2. 前端控制器&am…...

linux ubuntu的脚本知

目录 一、变量的引用 二、判断指定的文件是否存在 三、判断目录是否存在 四、判断最近一次命令执行是否成功 五、一些比较符号 六、"文件"的读取和写入 七、echo打印输出 八、ubuntu切换到root用户 九、后台进程的控制 N、其它可以参考的网址 脚本功能强大…...

Spring Boot 动态数据源切换

背景 随着互联网应用的快速发展&#xff0c;多数据源的需求日益增多。Spring Boot 以其简洁的配置和强大的功能&#xff0c;成为实现动态数据源切换的理想选择。本文将通过具体的配置和代码示例&#xff0c;详细介绍如何在 Spring Boot 应用中实现动态数据源切换&#xff0c;帮…...

Design Linear Filters in the Frequency Domain (MATLAB帮助文档)

Design Linear Filters in the Frequency Domain 这个帮助文档写得很好&#xff0c;简单明了&#xff0c;一句废话没有。 This topic describes functions that perform filtering in the frequency domain. 2-D Finite Impulse Response (FIR) Filters The Image Processi…...

Java知识及热点面试题总结(二)

1、什么是死锁(deadlock)? 两个线程或两个以上线程都在等待对方执行完毕才能继续往下执行的时候就发生了死锁。结果就是这些线程都陷入了无限的等待中。 如何避免线程死锁? 只要破坏产生死锁的四个条件中的其中一个就可以了。 破坏互斥条件&#xff1a;这个条件我们没有办法…...

开源加密库mbedtls及其Windows编译库

目录 1 项目简介 2 功能特性 3 性能优势 4 平台兼容性 5 应用场景 6 特点 7 Windows编译 8 编译静态库及其测试示例下载 1 项目简介 Mbed TLS是一个由ARM Maintained的开源项目&#xff0c;它提供了一个轻量级的加密库&#xff0c;适用于嵌入式系统和物联网设备。这个项…...

架构01-演进中的架构

零、文章目录 架构01-演进中的架构 1、原始分布式时代&#xff1a;Unix设计哲学下的服务探索 &#xff08;1&#xff09;背景 时间&#xff1a;20世纪70年代末到80年代初计算机硬件&#xff1a;16位寻址能力、不足5MHz时钟频率的处理器、128KB左右的内存转型&#xff1a;从…...

npm-运行项目报错:A complete log of this run can be found .......npm-cache_logs\

1.问题 没有找到对应的某种依赖&#xff0c;node_modules出现问题。 2.解决 (1)查看对应依赖是否引入或者是由于合并分支错误 引入js或依赖不存在。谨慎删除依赖包 (2)查找对应引入依赖进行安装最后解决方法-删除依赖包清除缓存 npm cache clean --force (2)重新向同事引入…...

C++中的函数对象

C 中函数对象的定义和特点 定义&#xff1a;函数对象&#xff08;Function Object&#xff09;也叫仿函数&#xff08;Functor&#xff09;&#xff0c;是一个类&#xff0c;这个类重载了函数调用运算符()。当创建这个类的对象后&#xff0c;可以像使用函数一样使用这个对象&am…...

godot游戏引擎_瓦片集和瓦片地图介绍

在 Godot 中&#xff0c;TileSet 和 TileMap 是用于处理瓦片地图的两个关键概念&#xff0c;它们的作用和用途有明显的区别。以下是两者的详细对比&#xff1a; 1. TileSet&#xff08;瓦片集&#xff09; TileSet 是资源&#xff0c;定义瓦片的内容和属性。 特点&#xff1a…...

[C++ 核心编程]笔记 4.1 封装

4.1.1 封装的意义 封装是C面向对象三大特性之一 封装的意义: 将属性和行为作为一个整体&#xff0c;表现生活中的事物将属性和行为加以权限控制 封装意义一: 在设计类的时候&#xff0c;属性和行为写在一起&#xff0c;表现事物 语法: class 类名{ 访问权限: 属性 /行为 }…...

学习使用jquery实现在指定div前面增加内容

学习使用jquery实现在指定div前面增加内容 设计思路代码示例 设计思路 选择要添加内容的指定元素‌&#xff1a; 使用jQuery选择器来选择你希望在其前添加内容的元素。例如&#xff0c;如果你有一个 元素&#xff0c;其ID为qipa250&#xff0c;你可以使用$(‘#qipa250’)来选择…...

如何写出好证明(支持思想的深入数学写作)

不断的修改和精炼是写作过程中的重要环节&#xff0c;数学写作最终目的是提供对问题的深刻洞察而非仅仅陈述细节。 根据harvey mudd college Francis Su教授的《GUIDELINES FOR GOOD MATHEMATICAL WRITING》讲稿&#xff0c;总结出撰写好的数学证明需要注意以下几个要点&#x…...

基于边缘智能网关的机房安全监测应用

随着我国工业互联网的扎实推进&#xff0c;越来越多地区积极建设信息基础设施&#xff0c;以充沛算力支撑产业物联网的可持续发展&#xff0c;数据机房就是其中的典型代表。而且随着机房规模的扩大&#xff0c;对于机房的安全管理难题挑战也日益增加。 面向数据机房安全监测与管…...

在WSL 2 (Ubuntu 22.04)安装Docker Ce 启动错误解决

查看WSL版本 在 Windows 命令提示符&#xff08;CMD&#xff09;或 PowerShell 中&#xff0c;你可以使用以下命令来查看已安装的 WSL 发行版及其版本信息&#xff1a; wsl -l -v(base) PS C:\Users\Lenovo> wsl -l -vNAME STATE VERSION * Ubuntu-2…...

【RISC-V CPU debug 专栏 3 -- Debugging RISC-V Cores】

文章目录 RISC-V 调试规范开源与多样性挑战调试规范的重要性外部调试支持的主要组件调试功能Lauterbach 的贡献RISC-V 调试规范 调试 RISC-V 内核涉及许多独特的挑战,这是由 RISC-V 的开源特性和多样化的生态系统所决定的。为了避免专有调试接口的泛滥,RISC-V 基金会内的工作…...

Unity Banner广告后面自定义背景,高度适配

目的是实现这个&#xff0c;代码放下面 已经测试十几台设备包括pad没问题 以Max聚合为例 展示&#xff08;关闭&#xff09;Banner的时候调用Show&#xff0c;Banner加载成功回调里调用RefreshSizeDelta 最终获得是像素 所以UGUI的Canvas使用Constant Pixel Size模式&#xff0…...

【技术文档:技术传播的灯塔】

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...

git的使用(简洁版)

什么是 Git&#xff1f; Git 是一个分布式版本控制系统 (DVCS)&#xff0c;用于跟踪文件的更改并协调多人之间的工作。它由 Linus Torvalds 在 2005 年创建&#xff0c;最初是为了管理 Linux 内核的开发。Git 的主要目标是提供高效、易用的版本控制工具&#xff0c;使得开发者…...

数据库编程(sqlite3)

一&#xff1a;数据库分类 常用的数据库 大型数据库 &#xff1a;Oracle商业、多平台、关系型数据库功能最强大、最复杂、市场占比最高的商业数据库 中型数据库 &#xff1a;Server是微软开发的数据库产品&#xff0c;主要支持windows平台 小型数据库 : mySQL是一个小型关系型…...

Python 中如何处理异常?

在Python中&#xff0c;异常处理是一种重要的编程技术&#xff0c;它允许开发者优雅地处理程序运行过程中出现的错误或异常情况&#xff0c;而不是让程序直接崩溃。 通过异常处理&#xff0c;我们可以使程序更加健壮、用户友好。 异常处理的基本结构 Python中最基本的异常处…...

RHCE——nfs网络文件系统

简介 NFS&#xff08;Network File System&#xff0c;网络文件系统&#xff09;是FreeBSD支持的文件系统中的一种&#xff0c;它允许网络中的计算机&#xff08;不同的计算机、不同的操作系统&#xff09;之间通过TCP/IP网络共享资源&#xff0c;主要在unix系列操作系统上使用…...

【人工智能】Python常用库-Scikit-learn常用方法教程

Scikit-learn 是一个功能强大的机器学习库&#xff0c;支持数据预处理、分类、回归、聚类、降维等功能&#xff0c;广泛用于模型开发与评估。以下是 Scikit-learn 的常用方法及详细说明。 1. 安装与导入 安装 Scikit-learn&#xff1a; pip install scikit-learn导入基本模块…...

sargo 官方镜像刷机

资料 官方镜像https://developers.google.cn/android/images?hlzh-cn zip镜像 https://googledownloads.cn/dl/android/aosp/sargo-rq3a.211001.001-factory-2a1befea.zip 使用 fastboot 刷写 下载好的镜像 步骤 先使用命令 adb reboot bootloader 再使用./falsh-all.sh 命…...

解决首次加载数据空指针异常

起初效果&#xff1a; 使用async...await异步加载数据 最终效果&#xff1a; 代码&#xff1a; <template><div class"user-list-container"><!-- 加载状态 --><div v-if"loading" class"loading">正在加载用户数据..…...

BERT的中文问答系统35

优化GUI布局、显示问答内容、增加自动搜索功能等。以下是完整的项目结构和代码&#xff1a; 项目结构 xihe241117/ ├── data/ │ └── train_data.jsonl ├── logs/ ├── models/ │ └── xihua_model.pth ├── requirements.txt ├── README.md └── 智…...

若依框架部署在网站一个子目录下(/admin)问题(

部署在子目录下首先修改vue.config.js文件&#xff1a; 问题一&#xff1a;登陆之后跳转到了404页面问题&#xff0c;解决办法如下&#xff1a; src/router/index.js 把404页面直接变成了首页&#xff08;大佬有啥优雅的解决办法求告知&#xff09; 问题二&#xff1a;退出登录…...

DB2数据库

DB2数据库是IBM公司开发的一种关系数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;它支持多种数据模型&#xff0c;包括关系模型、文档模型、图模型等。DB2最初是为大型机环境设计的&#xff0c;但现在它已扩展到各种平台&#xff0c;包括Windows、Linux和Unix等&…...

python excel接口自动化测试框架!

今天采用Excel继续写一个接口自动化测试框架。 设计流程图 这张图是我的excel接口测试框架的一些设计思路。 首先读取excel文件&#xff0c;得到测试信息&#xff0c;然后通过封装的requests方法&#xff0c;用unittest进行测试。 其中&#xff0c;接口关联的参数通过正则进…...

Spring框架整合单元测试

目录 一、配置文件方式 1.导入依赖 2.编写类和方法 3.配置文件applicationContext-test.xml 4.测试类 5.运行结果 二、全注解方式 1.编写类和方法 2.配置类 3.测试类 4.运行结果 每次进行单元测试的时候&#xff0c;都需要编写创建工厂&#xff0c;加载配置文件等相关…...

Java部分新特性

模式匹配 instance of 模式匹配 之前写法 public void print(Object o) {if (o instanceof String){String str (String) obj;System.out.println("This is a String of length " s.length());} else {System.out.println("This is not a String");} …...

keepalived+lVS(dr)高可用集群

keepalivedlVS(dr)高可用集群 规划 服务器名称IP描述masterkeepalivedlvsVIP:192.168.238.100DIP:192.168.238.151keepalived的master节点和lvs负载均衡backupkeepalivedlvsVIP:192.168.238.100DIP:192.168.238.152keepalived的备份节点和lvs负载均衡server1VIP:192.168.238.…...

【前端】JavaScript中的柯里化(Currying)详解及实现

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: 前端 文章目录 &#x1f4af;前言&#x1f4af;什么是柯里化&#xff1f;&#x1f4af;柯里化的特点&#x1f4af;柯里化的简单示例&#x1f4af;通用的柯里化实现&#x1f4af;柯里化让代码更易读的原因&#x1f4af…...

Cyberchef 辅助网络安全运营-数据格式转换

在网络安全的世界中&#xff0c;经常会遇到各种格式的数据&#xff0c;比如二进制&#xff0c;比如说16进制&#xff0c;URL编码&#xff0c;HTML编码&#xff0c;Unicode编码&#xff0c;Base格式的编码。网络安全运营一个明确的目标就是把这些不同的数据格式换成为可读的字符…...

鸿蒙面试 --- 性能优化(精简版)

一、性能优化的三个方面 感知流畅&#xff1a;通过合理运用动画提升用户对应用操作的感知流畅度&#xff0c;同时避免因动画滥用导致性能下降。涵盖视觉感知优化、转场场景动效感知流畅&#xff08;如出现 / 消失转场、导航转场、模态转场、共享元素转场等&#xff09;&#x…...

qsort函数详解+代码展示

文章目录 概要系列文章目录前言(1) 定义(2) 使用&#xff08;举例子 上代码&#xff09;1、定义数组&#xff1a;2、定义比较函数&#xff1a;3、调用 qsort&#xff1a;4、输出结果&#xff1a; (3) 注意事项 小结 概要 本篇博客将详细地介绍qsort排序函数&#xff0c;&#x…...

ms-hot29 解码方法

leetcode原题链接: 解码方法 ms-hot目录: ​​​​​​ ms-hot目录 上一篇&#xff1a;ms-hot28 合并两个有序数组 下一篇&#xff1a;二叉树的中序遍历 题目描述 一条包含字母 A-Z 的消息通过以下映射进行了 编码 &#xff1a; "1" -> A "2"…...

【5】STM32·FreeRTOS·临界段保护与调度器挂起

目录 一、临界段代码保护简介 二、临界段代码保护函数介绍 2.1、调用示例 2.2、内部实现 三、任务调度器的挂起和恢复 3.1、调用示例 3.2、内部实现 一、临界段代码保护简介 什么是临界段&#xff1a;临界段代码也叫做临界区&#xff0c;是指那些必须完整运行&#xff…...

daos源码编译

1. 前言 本文详细介绍如何在almalinux8.9上编译daos.2.0.0源码。系统环境如下&#xff1a; daos: 2.0.0 linux os: almalinux 8.9 linux kernel: 4.18.0-513.5.1.el8_9.x86_64之所以选择2.0.0版本&#xff0c;是因为daos从2.0.0开始是一个全新的架构设计&a…...

Flink--API 之Transformation-转换算子的使用解析

目录 一、常用转换算子详解 &#xff08;一&#xff09;map 算子 &#xff08;二&#xff09;flatMap 算子 &#xff08;三&#xff09;filter 算子 &#xff08;四&#xff09;keyBy 算子 元组类型 POJO &#xff08;五&#xff09;reduce 算子 二、合并与连接操作 …...

火山引擎VeDI在AI+BI领域的演进与实践

随着数字化时代的到来&#xff0c;企业对于数据分析与智能决策的需求日益增强。作为新一代企业级数据智能平台&#xff0c;火山引擎数智平台VeDI基于字节跳动多年的“数据驱动”实践经验&#xff0c;也正逐步在AI&#xff08;人工智能&#xff09;与BI&#xff08;商业智能&…...

java获取docker镜像构建日志

在Java中获取Docker镜像的构建日志&#xff0c;你可以使用Docker Engine API。以下是一个使用OkHttp库的示例代码&#xff0c;用于获取构建日志&#xff1a; import okhttp3.*; import java.io.IOException; public class DockerLogsFetcher { private static final St…...

Spring-boot整合Webservice服务端

Spring Boot整合Webservice服务端 本文是基于前辈一顿吃不饱的文章SpringBoot整合WebService&#xff08;服务端客户端&#xff09;-CSDN博客&#xff0c;由于工作需要用.NET调用其他系统发布的WebService服务&#xff0c;尝试用java搭建一个WebService服务端测试一下&#xf…...

动静分离具体是怎么实现的?

在 Nginx 中实现动静分离是一种常见的优化手段&#xff0c;用于提高网站的性能和可扩展性。以下是 Nginx 动静分离的一些基本概念和配置方法&#xff1a; 1、什么是动静分离&#xff1a; 动静分离是指将网站的静态资源&#xff08;如图片、CSS、JavaScript 文件&#xff09;与…...

如何取出.vmdk文件中的数据

前提&#xff1a;我的云服务器到期了&#xff0c;于是我将云服务器导出了.vmdk镜像。本想在vm虚拟机中启动&#xff0c;但是一直报错。很是苦恼。 首先下载DiskGenius这个软件。 点击磁盘-》打开磁盘 打开.vmdk文件 可以看到内部的文件了&#xff0c;可以选择对应文件导出到桌…...

Vue2中 vuex 的使用

1.安装 vuex 安装vuex与vue-router类似&#xff0c;vuex是一个独立存在的插件&#xff0c;如果脚手架初始化没有选 vuex&#xff0c;就需要额外安装。 yarn add vuex3 或者 npm i vuex3 233 Vue2 Vue-Router3 Vuex3 344 Vue3 Vue-Router4 Vuex4 2. 新建 store/index.j…...

Swift 数据类型

Swift 数据类型 Swift 是一种强类型语言&#xff0c;这意味着在 Swift 中声明的每个变量和常量都必须具有明确的类型。Swift 的类型系统旨在帮助开发者编写清晰、安全的代码。本文将详细介绍 Swift 中的基本数据类型&#xff0c;包括整数、浮点数、布尔值、字符和字符串。 整…...

【pyspark学习从入门到精通22】机器学习库_5

训练-验证分割 TrainValidationSplit 模型为了选择最佳模型&#xff0c;会对输入数据集&#xff08;训练数据集&#xff09;进行随机分割&#xff0c;分成两个子集&#xff1a;较小的训练子集和验证子集。分割只执行一次。 在这个例子中&#xff0c;我们还将使用 ChiSqSelect…...