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

【排序算法】快速排序

一、定义:

        快速排序是Hoare于1962年提出的一种二叉树结构的交换排序方法(也叫Hoare排序),是一种基于分治的排序方。其基本原理是将待排序的数组通过一趟排序分成两个独立的部分,其中一部分的所有数据另一部分的所有数据都,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列(非递归也是可行的,需要借助数据结构栈来实现)

二、递归思想:

排序只讲升序,升序和降序也就是大于和小于逻辑上的差别

Hoare法:

1、设置一个keyi记录头位置的数据,然后设计2个指分别为针end和begin; 一个从右边出发,一个从左边出发

2、end所指向的数据若是小于keyi则停下,然后begin走,所指向的数据若是大于keyi则停下,

3、将end和begin指向的元素进行互换

4、继续让end走,然后begin走,重复2-3,直到2者相遇,若是相遇,则将其与keyi指向的元素进交换,完成一次✨👉👉

5、keyi指向的数据的位置不是交换到了end和begin相遇的地方么,我们从这里以此处为界限,将区间分成2部分👉👉👉

也就是说我们要对左和右区间分别进行上述操作(2个人走路对比交换操作),完成2个区间,2个区间又会分化成4个区间,一直进行下去,分到区间只有一个数据就实现了。🤔🤔🤔有点类似与二叉树里的前序遍历的思想✨✨✨


我们发现走完一次中间值的特点左边全部小于他,右边全部大于他

我们走路的先后是有讲究的,2个人不是同时走的,而是一个人先走,一个人慢走,也就是说满足这个特点的话讲究先后顺序,因为决定了谁先遇见谁 那么如果我要左边先走了????🤔

✨✨✨用图来说话,是不是不能满足了;

🐸🐸hoare排序的难点在这里,就是要注意谁先走;为啥会有这种情况??

✨✨因为我们左边的任务是找大右边的任务是找小,然后而且我们的2个好兄弟并不是同时走的,是交替顺序走的哦!🧑‍🎓🧑‍🎓相遇前最后一次发生的交换,如下:这是互换好的

此时🐸左边大于keyi的数换到了end的位置,🐸右边小于keyi的数换到了begin的位置。🤔如果先走beginbegin走到end的位置停下,也就是我们会将大于keyi的数和其交换位置,所以不满足情况;若是先走end,那么end和begin相遇就是停在小于keyi的位置✨✨

其实这个才是影响最终结果的情况

👉✨总结:“先出发是为了在你遇见我之前而遇见你”---->>>我如果keyi的位置在首元素位置,和keyi进行互换的元素需要是小于keyi指向的元素,那么就需要任务为:找大于keyi的数的end指针先走;如果keyi尾元素处,最后与keyi交换的元素要大于keyi指向的元素,那么我们需要的是任务为:找大于keyi的begin指针先走。✨✨✨✨✨✨✨✨✨✨✨✨✨

 Hoare的思路差不多讲完了,是不是感觉已经可以自己写出代码了✨✨✨✨确实如此哈,但是你这会递归吗??🧐  哈哈哈,开玩笑啦❤️🫰笔者当然相信你会的,试着自己写一下嘛😁作为笔记,我还是记录一下


 🧑‍🎓✨开始时就说过Hoare排序类似二叉树的前序,先排序,当keyi换好位置后,将其当作“根节点”并分成2个区间,2个区间又进行排序,将keyi位置交换好,再次以keyi根分成2个区间,重复排序,一直分到区间只有一个元素,也就有序了,👉👉👉这个图就是先分区间,排序好后,分成2部分,因为每次排一次keyi交换后,他的左边全是小于他的值 右边全是大于他的值,每个区间的都有这样的特性,因此传参传的是区间✨

 我们排号区间,以节点作为区间分界点进行分割区间,如6的左右2边分成了2块区间

 优化1:keyi的选取

✨✨其实上面的递归看着是个二叉树的样子,keyi每次都换在区间中间的情况,并不是每次都是这样,根据待排序数组来看的哦🐸 数据顺序千变万化;

👉比如:一个逆序的数组,你将数据传入,那么keyi直接交换到最后一个位置,以最后一个位置分成一个区间;看图,发现了么,我还有重复排序情况,很容易发生栈溢出的风险☠️☠️

如果是 顺序的也是如此👉👉👉👉

时间复杂度退化到O(N^2)🤔🤔

因为keyi每次都是取首元素的值,所以会出现上述这种弊端,从keyi取值入手

1、随机值 (keyi的值是随机的,但是不推荐,随机值不好控制)

2、三数取中(在区间里面,左、右、中三个数取第二大的数到keyi里去)

注意:并不是keyi要换到这些位置,而是将取到值换到keyi指向的位置,因为我们本身的逻辑keyi就必须是在首元素位置✨✨

👉三数取中就可以避免上面的情况,数据左、右值以及中间值,三个数里面找中间值 ,然后将中间值换到首元素位置(逻辑不能变,keyi的位置初始情况在首元素✨);就可以保证排好序后,keyi的位置接近区间的中间

//优化:先三个数找中间:
int GetMin(int* a, int left, int right)
{int min = ((right - left) >> 1)+ left;if (a[min] < a[left]){if (a[min] > a[right]){return min;}else if (a[right]<a[left]){return right;}else{return left;}}else{if (a[min] < a[right]){return min;}else if (a[right] > a[left]){return right;}else{return left;}}}

优化2:小区间优化

每次分割二分,以二叉树角度看,最后一层是2^(h-1)个节点,总节点是2^h,那么我发现倒数三层占递归比例挺大的哎,我能不能把这一段优化掉???不用递归了,降低栈溢出的风险🤔🤔

这里我们想到用一个时间复杂度为O(N^2)的排序来解决

当区间元素个数小于10个时我就用一个插入排序 。修改一下递归条件即可递归结束条件即可

挖坑法:

因为有些大佬认为Hoare的方法不易理解,就想到了挖坑法进行,这里用到了坑位

思路:key取出首元素,2个指针;begin指向首位置,end指向尾位置

✨占坑位的不能动,刚开始没有坑位的是end,当end走到比key小的位置,我们将end指向的元素放到begin指向的坑位,此时end变成坑位,end不动,begin走,找到比key大的元素,将begin指向的元素放到end指向的坑位;直到二者相遇,此时一起蹲坑,将key放到坑里面✨

前后指针法:

思路:2指针,起始位置:prev指向首元素,cur在第二个元素位置,先让cur走,若是cur指向数据比key小,则prev后移动一位然后将cur指向的元素和prev指向的元素进行交换,当prev走过尾元素,也就是走出区间,将prev的值和key的值进行交换✨

总结:

🧑‍🎓后面2种写法都没有画过程,看动图其实就能很好的理解哦,很简单的,这里就不要考虑先走的问题了 直接规定好了。🐸当然啦✨✨三种方法的效率是一样的,后面的方法是为了更好的理解Hoare的思想,他们也就只是排序的写法改变了,方式都是一样的,逻辑没变✨


三、非递归思想:

✨我们通过递归可以发现,递归的是区间,对区间进行的修改,那么接下来以下面这个数组作为例子:👉

✨ 递归变非递归  其实就是将其变成迭代的思路

我们二叉树的前序遍历,就是根、左子树、右子树,那么我们的思路就是先遍历[0,9];然后遍历[0,4]再是[0,1] [3,4]等等,那么我们想到了创建一个栈来实现;利用先进后出的特点,可以将区间压进去,先入右区间,再入左,先出来的就是左区间

先入【0.9】 取出来进行排序

 排完以后找到5,然后再入[6,9] 和 [0,4],此时区间变成2部分

 [0,4]出栈,交换后,此时以下标2进行分区间入栈

👉👉👉 是不是很好看懂,就是先动左区间再动右区间,处理一边再处理另一边,其实就是深度优先遍历么🐸🧑‍🎓

✨结束条件就是空栈结束喽

当然啦,你可以用队列实现,但是要注意队列是先进先出,它是一层一层的进行排的

排序的和递归里的排序方法一样,三种方法随便选一个都可以用,我们的栈就是来模拟实现先序遍历的过程

四、代码实现:

优化:三数取中,每种实现方法都需要用这个函数

//三数取中
int GetMin(int* a, int left, int right)
{int min = ((right - left) >> 1)+ left;if (a[min] < a[left]){if (a[min] > a[right]){return min;}else if (a[right]<a[left]){return right;}else{return left;}}else{if (a[min] < a[right]){return min;}else if (a[right] > a[left]){return right;}else{return left;}}}

1、Hoare法:


void QuickSort1(int* a, int left, int right)
{//递归结束条件/*if (right <= left){return;}*///优化后:递归结束条件变成了当剩下10个以内的元素需要排序时,就使用插入排序if (right - left + 1 < 10){InsertSort(a + left, right - left + 1);}else {//3个取中int mid = GetMin(a, left, right);//将中的元素换到leftSwp(&a[mid], &a[left]);int keyi = left;int begin = left;int end = right;while (begin < end){//右边找小的,左边找大的while (a[end] >= a[keyi] && end > begin){end--;}while (a[begin] <= a[keyi] && end > begin){begin++;}//交换Swp(&a[begin], &a[end]);}Swp(&a[keyi], &a[begin]);QuickSort1(a, left, begin - 1);QuickSort1(a, end + 1, right);}
}

2、挖坑法:

//挖坑法(有一个人要蹲坑)效率差不多
void QuickSort2(int* a, int left, int right){if (right - left + 1 < 10){InsertSort(a + left, right - left + 1);}else{int mid = GetMin(a, left, right);Swp(&a[left], &a[mid]);int keyi = a[left];int begin = left;int end = right;while (begin < end){//仍然是左边找大,右边找小while (begin < end && a[end] >= keyi){end--;}a[begin] = a[end];while (begin < end && a[begin] <= keyi){begin++;}a[end] = a[begin];}a[end] = keyi;QuickSort2(a, left, begin - 1);QuickSort2(a, end + 1, right);}}

3、前后指针法:

//前后指针法:
void QuickSort3(int* a, int left, int right)
{/*if (left >= right){return;}*/if (right - left + 1 < 10){//小于10个数据进行插入排序InsertSort(a + left, right - left + 1);}else{int mid = GetMin(a, left, right);Swp(&a[mid], &a[left]);int keyi = left;int prev = left;int cur = left + 1;//cur先走,找小的while (cur <= right){//若小于a[keyi]则prev后移一位 再交换if (a[cur] <= a[keyi]){prev++;Swp(&a[prev], &a[cur]);}cur++;}Swp(&a[prev], &a[keyi]);QuickSort3(a, left, prev - 1);QuickSort3(a, prev + 1, right);}
}

4、非递归:

#pragma once#include<stdio.h>
#include<stdbool.h>
#include<stdlib.h>
#include<assert.h>typedef int LTDataType;
//顺序表(栈)
typedef struct SL
{LTDataType* a;int top;int capacity;
}SL;
//入栈
void SLPush(SL* p,LTDataType x)
{//不能传NULL,判空;assert(p);if (p->top == p->capacity){//先判断是否为0,好进行扩容int newnode = p->capacity == 0 ? 4 : 2 * (p->capacity);//扩容;创建一个临时变量接收新的空间,成功在将其交给p->a;LTDataType* s = (LTDataType*)realloc(p->a,newnode * sizeof(LTDataType));if (s == NULL){perror("realloc");return;}p->a = s;p->capacity = newnode;}p->a[p->top] = x;//指向下一个数据地址p->top++;
}
//出栈(类似尾删)
void SLPop(SL* p)
{//是否为空assert(p);assert(p->top > 0);p->top--;
}
//初始化
void SLInit(SL* p)
{p->a = NULL;p->capacity = 0;//p->top = -1;//指向栈顶的数据p->top = 0;//指向栈顶的下一个数据
}
//销毁
void SLDestroy(SL* p)
{assert(p);free(p->a);p->a = NULL;p->capacity = p->top = 0;
}
//判空
bool SLEmpty(SL* p)
{//不能是空地址assert(p);//为0就是真(true),为1就是假(flase)return p->top == 0;
}
//数据个数
int SLsize(SL* p)
{int size = p->top;return size;
}
//取数据:
LTDataType SLPot(SL*p)
{assert(p);return p->a[p->top-1];
}//非递归,将递归变成迭代,最重要的是区间
void QuickSortNonR(int* a, int left, int right)
{SL pts;SLInit(&pts);SLPush(&pts,right);SLPush(&pts, left);while (!SLEmpty(&pts)){int begin = SLPot(&pts);SLPop(&pts);int end = SLPot(&pts);SLPop(&pts);int mid = GetMin(a, begin,end);Swp(&a[mid], &a[begin]);int keyi = begin;int prev = begin;int cur = begin + 1;//cur先走,找小的while (cur <= end){//若小于a[keyi]则prev后移一位 再交换if (a[cur] <= a[keyi]){prev++;Swp(&a[prev], &a[cur]);}cur++;}Swp(&a[prev], &a[keyi]);if (prev + 1 < end){SLPush(&pts, end);SLPush(&pts, prev + 1);}if (prev - 1 > begin){SLPush(&pts, prev-1);SLPush(&pts, 0);}}SLDestroy(&pts);}

                                                       

相关文章:

【排序算法】快速排序

一、定义&#xff1a; 快速排序是Hoare于1962年提出的一种二叉树结构的交换排序方法&#xff08;也叫Hoare排序&#xff09;&#xff0c;是一种基于分治的排序方。其基本原理是将待排序的数组通过一趟排序分成两个独立的部分&#xff0c;其中一部分的所有数据比另一部分的所有数…...

OS复习笔记ch7-2

页式管理 学过计组的同学都了解一点页式管理&#xff0c;就是将内存划分成较小的、大小固定的、等大的块。现在OS引入了进程的概念&#xff0c;那么为了匹配内存的分块&#xff0c;同样把进程也划分成同样大小的块。 这里区分两个概念 The chunks of a process are called p…...

4.通用编程概念

目录 一、变量与常量1.1 变量1.2 常量 二、遮蔽三、数据类型3.1 标量类型1. 整型2. 浮点型3. 布尔类型4.字符类型 3.2 复合类型1. 元组2. 数组 四、函数五、语句和表达式六、函数的返回值 一、变量与常量 1.1 变量 在Rust中默认的变量是不可变的&#xff0c;如果修改其值会导致…...

iBeacon赋能AR导航:室内定位技术的原理与优势

室内定位导航对于大型商场、机场、医院等复杂室内环境至关重要&#xff0c;它帮助人们快速找到目的地&#xff0c;提高空间利用率。AR技术通过将虚拟信息叠加在现实世界&#xff0c;提供直观导航指引&#xff0c;正在成为室内导航的新趋势&#xff0c;增强用户互动体验&#xf…...

【sklearn】【逻辑回归1】

学习笔记来自&#xff1a; 所用的库和版本大家参考&#xff1a; Python 3.7.1Scikit-learn 0.20.1 Numpy 1.15.4, Pandas 0.23.4, Matplotlib 3.0.2, SciPy 1.1.0 1 概述 1.1 名为“回归”的分类器 在过去的四周中&#xff0c;我们接触了不少带“回归”二字的算法&#xf…...

java(kotlin)和 python 通过DoubleCloud的kafka进行线程间通信

进入 DoubleCloud https://www.double.cloud 创建一个kafka 1 选择语言 2 运行curl 的url命令启动一个topic 3 生成对应语言的token 4 复制3中的配置文件到本地&#xff0c;命名为client.properties 5 复制客户端代码 对python和java客户端代码进行了重写&#xff0c;java改成…...

vivado DIAGRAM、HW_AXI

图表 描述 块设计&#xff08;.bd&#xff09;是在IP中创建的互连IP核的复杂系统 Vivado设计套件的集成商。Vivado IP集成器可让您创建复杂的 通过实例化和互连Vivado IP目录中的IP进行系统设计。一块 设计是一种分层设计&#xff0c;可以写入磁盘上的文件&#xff08;.bd&…...

学习分享-为什么把后台的用户验证和认证逻辑放到网关

将后台的用户验证和认证逻辑放到网关&#xff08;API Gateway&#xff09;中是一种常见的设计模式&#xff0c;这种做法在微服务架构和现代应用中有许多优势和理由&#xff1a; 1. 集中管理认证和授权 统一的安全策略 在一个包含多个微服务的系统中&#xff0c;如果每个服务…...

27 ssh+scp+nfs+yum进阶

ssh远程管理 ssh是一种安全通道协议&#xff0c;用来实现字符界面的远程登录。远程复制&#xff0c;远程文本传输。 ssh对通信双方的数据进行了加密。 用户名和密码登录 密钥对认证方式&#xff08;可以实现免密登录&#xff09; ssh 22 网络层 传输层 数据传输的过程中是…...

LabVIEW液压伺服压力机控制系统与控制频率选择

液压伺服压力机的控制频率是一个重要的参数&#xff0c;它直接影响系统的响应速度、稳定性和控制精度。具体选择的控制频率取决于多种因素&#xff0c;包括系统的动态特性、控制目标、硬件性能以及应用场景。以下是一些常见的指导原则和考量因素&#xff1a; 常见的控制频率范…...

阿里云(域名解析) certbot 证书配置

1、安装 certbot ubuntu 系统&#xff1a; sudo apt install certbot 2、申请certbot 域名证书&#xff0c;如申请二级域名aa.example.com 的ssl证书&#xff0c;同时需要让 bb.aa.example.com 也可以使用此证书 1、命令&#xff1a;sudo certbot certonly -d “域名” -d “…...

Web LLM 攻击技术

概述 在ChatGPT问世以来&#xff0c;我也尝试挖掘过ChatGPT的漏洞&#xff0c;不过仅仅发现过一些小问题&#xff1a;无法显示xml的bug和错误信息泄露&#xff0c;虽然也挖到过一些开源LLM的漏洞&#xff0c;比如前段时间发现的Jan的漏洞&#xff0c;但是不得不说传统漏洞越来…...

Java等待异步线程池跑完再执行指定方法的三种方式(condition、CountDownLatch、CyclicBarrier)

Java等待异步线程池跑完再执行指定方法的三种方式(condition、CountDownLatch、CyclicBarrier) Async如何使用 使用Async标注在方法上&#xff0c;可以使该方法异步的调用执行。而所有异步方法的实际执行是交给TaskExecutor的。 1.启动类添加EnableAsync注解 2. 方法上添加A…...

秒杀优化+秒杀安全

1.Redis预减库存 1.OrderServiceImpl.java 问题分析 2.具体实现 SeckillController.java 1.实现InitializingBean接口的afterPropertiesSet方法&#xff0c;在bean初始化之后将库存信息加载到Redis /*** 系统初始化&#xff0c;将秒杀商品库存加载到redis中** throws Excepti…...

48、Flink 的 Data Source API 详解

a&#xff09;概述 本节将描述 FLIP-27 中引入的新 Source API 的主要接口。 b&#xff09;Source Source API 是一个工厂模式的接口&#xff0c;用于创建以下组件。 Split EnumeratorSource ReaderSplit SerializerEnumerator Checkpoint Serializer 此外&#xff0c;Sou…...

深入解析Java扩展机制:SPI与Spring.factories

目录 Java SPI概述 1.1 什么是SPI&#xff1f;1.2 SPI的工作原理1.3 SPI的优缺点 SPI的应用 2.1 Java标准库中的SPI应用2.2 自定义SPI示例 Spring.factories概述 3.1 什么是spring.factories&#xff1f;3.2 spring.factories的工作原理3.3 spring.factories的优缺点 spring.f…...

Vue2之模板语法

文章目录 1.模板语法1.1 插值语法{{}}可以写什么1.2 指令语法1.2.1 指令概述1.2.2 v-bind指令1.2.3 v-model指令 1.模板语法 1.1 插值语法{{}}可以写什么 &#xff08;1&#xff09;在data中声明的 &#xff08;2&#xff09;常量 &#xff08;3&#xff09;合法的JavaScript…...

java基础练习题

1、一个".java"源文件中是否可以包括多个类&#xff1f;有什么限制&#xff1f; 可以包含多个类。但是只有一个类可以声明为public&#xff0c;且要求声明为public的类的类名与源文件名相同。 2、java的优势&#xff1f; a、跨平台性 b、安全性高 c、简单性 d、…...

unity中通过实现底层接口实现非按钮(图片)的事件监听

编写监听脚本 PEListenter 继承自MonoBehaviour类&#xff0c;并实现了IPointerDownHandler、IPointerUpHandler和IDragHandler接口&#xff0c;按照需求定义需要接收事件&#xff08;鼠标按下、抬起、拖拽&#xff09;的回调函数 //监听类&#xff08;需要挂载在物体上面&am…...

重庆耶非凡科技有限公司的选品师项目加盟靠谱吗?

在当今电子商务的浪潮中&#xff0c;选品师的角色愈发重要。而重庆耶非凡科技有限公司以其独特的选品师项目&#xff0c;在行业内引起了广泛关注。对于想要加盟该项目的人来说&#xff0c;项目的靠谱性无疑是首要考虑的问题。 首先&#xff0c;我们来看看耶非凡科技有限公司的背…...

《青少年编程与数学》课程方案:4、课程策略

《青少年编程与数学》课程方案&#xff1a;4、课程策略 一、工程师思维二、使命感驱动三、价值观引领四、学习现代化五、工作生活化六、与时代共进 《青少年编程与数学》课程策略强调采用工程师思维&#xff0c;避免重复造轮子&#xff0c;培养使命感&#xff0c;通过探索兴趣、…...

用爬虫实现---模拟填志愿

先来说实现逻辑&#xff0c;首先我要获取到这个网站上所有的信息&#xff0c;那么我们就可以开始对元素进行检查 我们发现他的每一个学校信息都有一个对应的属性&#xff0c;并且是相同的&#xff0c;那么我们就可以遍历这个网页中的所有属性一样的开始爬取 在来分析&#xff0…...

vscode Run Code输出出现中文乱码情况问题解决方案

主要解决方案是通过修改计算机默认的编码格式,来完成的。 chcp 是 Windows 操作系统中的一个命令,用于显示或设置控制台的代码页(code page)。代码页决定了控制台如何解释和显示字符,特别是非 ASCII 字符(例如 Unicode 字符)。 使用方法 显示当前代码页: 输入 chcp 而…...

代码随想录训练营Day30

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、重新安排行程 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 今天是跟着代码随想录刷题的第30天&#xff0c;主要是复习了回溯算法…...

Swift 序列(Sequence)排序面面俱到 - 从过去到现在(二)

概览 在上篇 Swift 序列(Sequence)排序面面俱到 - 从过去到现在(一)博文中,我们讨论了 Swift 语言中序列和集合元素排序的一些基本知识,我们还给出了以自定义类型中任意属性排序的“康庄大道”。 不过在实际的撸码场景中,我们往往需要的是“多属性”同时参与到排序的考…...

STM32F103C8T6基于HAL库移植uC/OS-III

文章目录 一、建立STM32CubeMX工程二、移植1、 uC/OS-III源码2、移植过程 三、配置相关代码1、bsp.c和bsp.h2、main.c3、修改启动代码4、修改app_cfg.h文件5、修改includes.h文件6、修改lib_cfg.h文件 四、编译与烧录总结参考资料 学习嵌入式实时操作系统&#xff08;RTOS&…...

微服务学习Day9-分布式事务Seata

文章目录 分布式事务seata引入理论基础CAP定理BASE理论 初识Seata动手实践XA模式AT模式TCC模式SAGA模式 高可用 分布式事务seata 引入 理论基础 CAP定理 BASE理论 初识Seata 动手实践 XA模式 AT模式 TCC模式 Service Slf4j public class AccountTCCServiceImpl implements A…...

vue用vite配置代理解决跨域问题(target、rewrite和changeOrigin的使用场景)

Vite的target、rewrite和changeOrigin的使用场景 1. target 使用场景&#xff1a;target 属性在 Vite 的 vite.config.ts 或 vite.config.js 文件的 server.proxy 配置中指定&#xff0c;用于设置代理服务器应该将请求转发到的目标地址。这通常是一个后端服务的API接口地址。…...

为什么PPT录制没有声音 电脑ppt录屏没有声音怎么办

一、为什么PPT录制没有声音 1.软件问题 我们下载软件的时候可能遇到软件损坏的问题&#xff0c;导致录制没有声音&#xff0c;但其他功能还是可以使用的。我建议使用PPT的隐藏功能&#xff0c;下载插件&#xff0c;在PPT界面的加载项选项卡中就能使用。我推荐一款可以解决录屏…...

JDBC学习笔记(三)高级篇

一、JDBC 优化及工具类封装 1.1 现有问题 1.2 JDBC 工具类封装 V1.0 resources/db.properties配置文件&#xff1a; driverClassNamecom.mysql.cj.jdbc.Driver urljdbc:mysql:///atguigu usernameroot password123456 initialSize10 maxActive20 工具类代码&#xff1a; p…...

做网站是做完给钱还是/自己如何制作网页

Regex r new Regex(".*[\\u4e00-\\u9faf].*");r.IsMatch(username)转载于:https://www.cnblogs.com/ZX-LMY/p/5535087.html...

做网站建设的公司排名/网络营销研究背景及意义

2019独角兽企业重金招聘Python工程师标准>>> Springboot1.5.1启动报错&#xff0c;不知道什么原因导致的&#xff0c;结果升级到1.5.2错误消失了、、、 1.5.1.RELEASE (v1.5.1.RELEASE) 2017-05-10 14:33:15.266 INFO 31825 --- [ main] com.raintai.mp…...

商城网站建设流程图/如何查询百度收录情况

语法 switch(n) { case 1:执行代码块 1break; case 2:执行代码块 2break; default:n 与 case 1 和 case 2 不同时执行的代码 }工作原理&#xff1a;首先设置表达式 n&#xff08;通常是一个变量&#xff09;。随后表达式的值会与结构中的每个 case 的值做比较。如果存在匹配&am…...

腾讯公众号小程序/c盘优化大师

C-Free 5 下载 C-Free 5 官网&#xff1a;http://www.programarts.com/cfree_ch/ 1. 点击下载 2. 选择下载C-Free 5.0 专业版 3. 安装包下载完成 C-Free 5 安装 双击刚下载的安装包&#xff0c;然后Next 同意协议&#xff0c;然后Next 安装路径不可以有空格&#xff0…...

如何创办.com网站/中国企业培训网

文章目录前言一、为什么我们要读源码?二、阅读源码, 方法也很重要:前言 大家好我是James, 说起源码, 我相信大家都比较头疼, 有很多人面试也是坑在源码上, 那为什么要学习源码,我结合自己多年的源码阅读经验,James将多年经验阅读源码的经验给大家总结一下。 一、为什么我们要…...

wordpress主动提交百度/济南网络优化网站

今年9月10号华为开发者大会中&#xff0c;华为正式开源发布了鸿蒙os 2.0系统&#xff0c;鸿蒙终于开放给开发者&#xff0c;目前只能用来做指挥屏/手表/车机。华为手机版本的鸿蒙系统则要到今年的12月才提供。在9月10号我就去鸿蒙gitee上的开源代码库中参观&#xff0c;主要是看…...