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

通过Java实现插入排序(直接插入,希尔)与选择排序(直接选择,堆排)

目录

(一)插入排序

1.直接插入排序

(1)核心思想:

 (2)代码实现(以从小到大排序为例):

(3)代码分析:

2.希尔排序(缩小增量排序)

(1)核心思想:

(2)代码实现(以从小到大排序为例): 

(3)代码分析:

(二)选择排序

1.直接选择排序

(1)核心思想:

(2)代码实现(以从小到大排序为例):

(3)代码分析:

2.堆排序

(1)核心思想:

(2)代码实现(以从小到大排序为例):

 (3)代码分析:

(三)示例以及各算法耗时参考

1.代码结构

2.程序源码

(1)Sort类:

(2)Test类:

3.测试结果

 ​编辑


(一)插入排序

1.直接插入排序

(1)核心思想:

直接插入排序,顾名思义,即将非有序部分的元素按大小规律逐个插入到有序的部分中,最终使得整体有序。举个简单的例子:当我们在玩扑克牌逐个摸牌时,就会将新牌插入到原来有序的手牌中,此时其实就用到了插入排序的思想。

 (2)代码实现(以从小到大排序为例):

    public static void insertSort(int[] array){//遍历非有序部分数组for(int i=1;i<array.length;i++){//取出非有序部分的第一个元素并向前逐个比对int tmp=array[i];int j=i-1;for(;j>=0;j--){if(tmp<array[j]){//若该元素比前面某元素小,则某元素后移,该元素继续向前比对array[j+1]=array[j];}else{//相反若该元素比前面某元素大,则退出循环break;}//内层循环结束说明已经为该元素找到合适位置,直接插入即可array[j+1]=tmp;}}}

(3)代码分析:

1)时间复杂度:最好情况下(数组本身有序):O(N);最坏情况下(数组本身逆序):O(N^2)。

2)空间复杂度:O(1)(即并未申请额外内存)。

3)稳定性:稳定。

由上可知对于越有序的数组,使用直接插入排序更有优势。

2.希尔排序(缩小增量排序)

(1)核心思想:

希尔排序,又称为缩小增量排序,其本质为直接插入排序的优化形式,在直接插入排序的基础上采取了分治(即分而治之,分组考虑)的思想:通过设定元素下标间隔增量gap来将一组元素分为多组,分别进行直接插入排序,将每个组排完序后将gap减小重复上述过程,直到gap为1,上述全过程整租元素都在不断趋于有序,最终实现排序效果。

例如:数组元素为10时且设定第一次gap为5的情况:

(2)代码实现(以从小到大排序为例): 

//实现希尔排序方法public static void shellSort(int[] array){//设定间隔增量gapint gap=array.length;while (gap > 1) {//每次循环缩小间隔增量gap/=2;//以间隔增量对数组进行分组插入排序shellSortChild(array,gap);}}//实现希尔排序的底层方法private static void shellSortChild(int[]array,int gap){//遍历非有序部分数组,i++表示对每组进行交替排序for(int i=gap;i<array.length;i++){//取出非有序部分的第一个元素并向前逐个比对int tmp=array[i];int j=i-gap;for(;j>=0;j-=gap){if(tmp<array[j]){//若该元素比前面某元素小,则某元素后移,该元素继续向前比对array[j+gap]=array[j];}else{//相反若该元素比前面某元素大,则退出循环break;}//内层循环结束说明已经为该元素找到合适位置,直接插入即可array[j+gap]=tmp;}}}

(3)代码分析:

1)时间复杂度:目前无法严格证明,原因是该算法根据gap的取法不同而不同(本题中gap取法为二分法,即不断除以二),并且当gap较大时每组遍历次数较少,gap较小时整体又更有序,无法进行严格计算,但有学者通过大量实验证明希尔排序的时间复杂度应该介于N^1.25~1.6N^1.25之间,可以估计为O(N^1.3)。

2)空间复杂度:O(1)(即并未申请额外内存)。

3)稳定性:不稳定。

联系直接插入排序可知,希尔排序可以克服传统直接插入排序在完全逆序情况下时间复杂度过高的劣势。

(二)选择排序

1.直接选择排序

(1)核心思想:

直接选择排序,顾名思义,即每一次从非有序部分的元素中选出最小(或最大)的一个元素,存放在非有序部分的起始位置,直到全部非有序部分元素全部排完,此时整组元素有序。

(2)代码实现(以从小到大排序为例):

    //实现直接选择排序public static void selectSort(int[]array){//遍历非有序部分数组for(int i=0;i< array.length;i++){//默认最小值下标为起始下标int minIndex=i;//遍历剩余部分寻找最小值下标for(int j=i+1;j< array.length;j++){if(array[j]<array[i]){minIndex=j;}}//循环结束证明已经找到最小值下标,与非有序部分起始位置交换int tmp=array[minIndex];array[minIndex]=array[i];array[i]=tmp;}}

(3)代码分析:

1)时间复杂度:无论何时均为O(N^2)。

2)空间复杂度:O(1)(即并未申请额外内存)。

3)稳定性:不稳定。

2.堆排序

(1)核心思想:

利用堆的优先级特性,升序排列建大堆,降序排列建小堆,每次将堆顶元素和未排序堆尾元素互换后进行向上调整(这样堆尾元素一定是当前堆的最值),最终整个堆有序。(思路类似于直接选择排序或者冒泡排序,即每次都将未排序的部分中的最值放于末尾,如此最终整个数组有序)。

(2)代码实现(以从小到大排序为例):

    //实现堆排序//创建一个大根堆的方法public static void createMaxHeap(int[] array){//从最后一棵子树倒序调整for(int parent=((array.length-1-1)/2);parent>=0;parent--){//调用向下调整的底层方法maxSiftDown(array,parent,array.length-1);}}//创建大根堆时调用到的向下调整的底层方法private static void maxSiftDown(int[]array,int parent,int end){//默认子女中的最大值为左子女int child=2*parent+1;while(child<end){//判断右子女是否为二者中最大值if(child+1<end){if(array[child]<array[child+1]){child++;}}if(array[parent]<array[child]){//子女节点中最大值大于双亲则进行交换调整int temp=array[parent];array[parent]=array[child];array[child]=temp;//向下迭代parent=child;child=2*parent+1;}else{//子女节点中最大值小于双亲说明该树已经为大根堆,无需向下调整,直接中断即可break;}}}//利用创建的大根堆实现堆排序public static void heapSort(int[]array){createMaxHeap(array);int end= array.length-1;while(end>0){//将堆顶元素和堆尾元素交换int temp=array[end];array[end]=array[0];array[0]=temp;//利用大根堆向下调整的方法maxSiftDown(array,0,end);end--;}}

(注:堆的创建,向上调整部分具体思路及讲解可见本人博客:通过Java模拟实现堆(大根堆与小根堆)及其相关操作http://t.csdnimg.cn/JZlWL )

 (3)代码分析:

1)时间复杂度:O(N^log N)。

2)空间复杂度:O(1)(即并未申请额外内存,注意建堆也是在原数组上进行操作的)。

3)稳定性:不稳定。

(三)示例以及各算法耗时参考

1.代码结构

1. Sort类:内部实现直接选择排序,希尔排序,直接插入排序,堆排序相关方法(即上文实现的四种算法)

2.Test类:实现创建顺序数组,逆序数组,随机数组的方法(用来测试四种算法)以及测量四种算法耗时的方法,并在main方法中进行示例演示。

2.程序源码

(1)Sort类:

public class Sort {//实现直接插入排序方法public static void insertSort(int[] array){//遍历非有序部分数组for(int i=1;i<array.length;i++){//取出非有序部分的第一个元素并向前逐个比对int tmp=array[i];int j=i-1;for(;j>=0;j--){if(tmp<array[j]){//若该元素比前面某元素小,则某元素后移,该元素继续向前比对array[j+1]=array[j];}else{//相反若该元素比前面某元素大,则退出循环break;}//内层循环结束说明已经为该元素找到合适位置,直接插入即可array[j+1]=tmp;}}}//实现希尔排序方法public static void shellSort(int[] array){//设定间隔增量gapint gap=array.length;while (gap > 1) {//每次循环缩小间隔增量gap/=2;//以间隔增量对数组进行分组插入排序shellSortChild(array,gap);}}//实现希尔排序的底层方法private static void shellSortChild(int[]array,int gap){//遍历非有序部分数组,i++表示对每组进行交替排序for(int i=gap;i<array.length;i++){//取出非有序部分的第一个元素并向前逐个比对int tmp=array[i];int j=i-gap;for(;j>=0;j-=gap){if(tmp<array[j]){//若该元素比前面某元素小,则某元素后移,该元素继续向前比对array[j+gap]=array[j];}else{//相反若该元素比前面某元素大,则退出循环break;}//内层循环结束说明已经为该元素找到合适位置,直接插入即可array[j+gap]=tmp;}}}//实现直接选择排序public static void selectSort(int[]array){//遍历非有序部分数组for(int i=0;i< array.length;i++){//默认最小值下标为起始下标int minIndex=i;//遍历剩余部分寻找最小值下标for(int j=i+1;j< array.length;j++){if(array[j]<array[i]){minIndex=j;}}//循环结束证明已经找到最小值下标,与非有序部分起始位置交换int tmp=array[minIndex];array[minIndex]=array[i];array[i]=tmp;}}//实现堆排序//创建一个大根堆的方法public static void createMaxHeap(int[] array){//从最后一棵子树倒序调整for(int parent=((array.length-1-1)/2);parent>=0;parent--){//调用向下调整的底层方法maxSiftDown(array,parent,array.length-1);}}//创建大根堆时调用到的向下调整的底层方法private static void maxSiftDown(int[]array,int parent,int end){//默认子女中的最大值为左子女int child=2*parent+1;while(child<end){//判断右子女是否为二者中最大值if(child+1<end){if(array[child]<array[child+1]){child++;}}if(array[parent]<array[child]){//子女节点中最大值大于双亲则进行交换调整int temp=array[parent];array[parent]=array[child];array[child]=temp;//向下迭代parent=child;child=2*parent+1;}else{//子女节点中最大值小于双亲说明该树已经为大根堆,无需向下调整,直接中断即可break;}}}//利用创建的大根堆实现堆排序public static void heapSort(int[]array){createMaxHeap(array);int end= array.length-1;while(end>0){//将堆顶元素和堆尾元素交换int temp=array[end];array[end]=array[0];array[0]=temp;//利用大根堆向下调整的方法maxSiftDown(array,0,end);end--;}}
}

(2)Test类:

import java.util.Arrays;
import java.util.Random;public class Test {//生成一个顺序数组的方法public static void order(int[] array){for(int i=0;i< array.length;i++){array[i]=i;}}//生成一个逆序数组的方法public static void reverseOrder(int[] array){for(int i=0;i<array.length;i++){array[i]= array.length-i;}}//生成一个随机数数组的方法public static void randomOrder(int[] array){Random random=new Random();for(int i=0;i<array.length;i++){array[i]= random.nextInt(10_0000);}}//测试直接插入排序时间的方法public static void testInsertSort(int[]array){//拷贝一个新的数组array= Arrays.copyOf(array,array.length);//获取起始时间戳long starttime=System.currentTimeMillis();Sort.insertSort(array);//获取终止时间戳long endtime=System.currentTimeMillis();//输出耗时System.out.println("直接插入排序耗时:"+(endtime-starttime));}//测试希尔排序时间的方法public static void testShellSort(int[]array){//拷贝一个新的数组array= Arrays.copyOf(array,array.length);//获取起始时间戳long starttime=System.currentTimeMillis();Sort.shellSort(array);//获取终止时间戳long endtime=System.currentTimeMillis();//输出耗时System.out.println("希尔排序耗时:"+(endtime-starttime));}//测试直接选择排序时间的方法public static void testSelectSort(int[]array){//拷贝一个新的数组array= Arrays.copyOf(array,array.length);//获取起始时间戳long starttime=System.currentTimeMillis();Sort.selectSort(array);//获取终止时间戳long endtime=System.currentTimeMillis();//输出耗时System.out.println("直接选择排序耗时:"+(endtime-starttime));}//测试直接选择排序时间的方法public static void testHeapSort(int[]array){//拷贝一个新的数组array= Arrays.copyOf(array,array.length);//获取起始时间戳long starttime=System.currentTimeMillis();Sort.heapSort(array);//获取终止时间戳long endtime=System.currentTimeMillis();//输出耗时System.out.println("堆排序耗时:"+(endtime-starttime));}public static void main(String[] args) {int[]array=new int[10_0000];//测试顺序数组情况System.out.println("***********************");System.out.println("顺序数组情况:");order(array);testInsertSort(array);testShellSort(array);testSelectSort(array);testHeapSort(array);System.out.println("***********************");//测试逆序数组情况System.out.println("逆序数组情况:");reverseOrder(array);testInsertSort(array);testShellSort(array);testSelectSort(array);testHeapSort(array);System.out.println("***********************");//测试随机数组情况System.out.println("随机数组情况:");randomOrder(array);testInsertSort(array);testShellSort(array);testSelectSort(array);testHeapSort(array);System.out.println("***********************");}
}

3.测试结果

 

上图可以直观感受各算法在不同情况下的表现。

以上便是通过Java实现插入排序(直接插入,希尔)与选择排序(直接选择,堆排)的全部内容,如有不当,敬请斧正!

相关文章:

通过Java实现插入排序(直接插入,希尔)与选择排序(直接选择,堆排)

目录 &#xff08;一&#xff09;插入排序 1.直接插入排序 &#xff08;1&#xff09;核心思想&#xff1a; &#xff08;2&#xff09;代码实现&#xff08;以从小到大排序为例&#xff09;&#xff1a; &#xff08;3&#xff09;代码分析&#xff1a; 2.希尔排序&#xff08…...

大型分布式B2B2C多用户商城7.0企业版源码分享【java语言、方便二次开发】

项目介绍 项目基于SpringBoot开发&#xff0c;运营端和商户端采用ElementVue&#xff0c;买家使用采用VueIviewnuxt服务端渲染。使用到的中间件有Redis、RabbitMQ、ElasticSearch、FastDFS、Mongodb等。主要功能包括有运营管理、商品管理、订单管理、售后管理、会员管理、财务…...

C++的结构体、联合体、枚举类型(一)

1.C++的结构体 2.C++的联合体 3.C++的枚举类型 1.C++的结构体 (1)C++中定义结构体变量,可以省略struct关键字 struct XX{…}; XX x;//定义结构体变量直接省略struct(2)C++结构体中可以直接定义函数,谓之成员函数(又叫方法)(3)在成员函数中可以直接访问该结构体的成员变…...

搭建高可用OpenStack(Queen版)集群(一)之架构环境准备

一、搭建高可用OpenStack&#xff08;Queen版&#xff09;集群之架构环境准备 一、架构设计 二、初始化基础环境 1、管理节点创建密钥对&#xff08;方便传输数据&#xff09; 所有控制节点操作 # ssh-keygen #一路回车即可 Generating public/private rsa key pair. Enter f…...

通过Stack Overflow线程栈溢出的问题实例,详解C++程序线程栈溢出的诸多细节

目录 1、问题说明 2、从Visual Studio输出窗口中找到了线索&#xff0c;发生了Stack Overflow线程栈溢出的异常 3、发生Stack Overflow线程栈溢出的原因分析 4、线程占用的栈空间大小说明 5、引发线程栈溢出的常见原因和场景总结 6、在问题函数入口处添加return语句&…...

LeetCode刷题笔记 | 3 | 无重复字符的最长子串 | 双指针 | 滑动窗口 | 2025兴业银行秋招笔试题 | 哈希集合

&#x1f64b;大家好&#xff01;我是毛毛张! &#x1f308;个人首页&#xff1a; 神马都会亿点点的毛毛张 这是一道银行的面试题&#xff0c;就是简单&#xff1f;&#xff01; LeetCode链接&#xff1a;3. 无重复字符的最长子串 1.题目描述 给定一个字符串 s &#xff0c…...

验证cuda和pytorch都按照成功了

要验证您的PyTorch是否能够调用CUDA&#xff0c;您可以执行以下步骤&#xff1a; 1. **检查CUDA是否可用**&#xff1a; 在Python中运行以下代码来检查CUDA是否可用&#xff1a; python import torch print(torch.cuda.is_available()) 如果输出为 True&…...

iOS开发如何自己捕获Crash

为了在iOS中捕获和处理未捕获的Objective-C异常和系统信号引起的崩溃&#xff0c;可以使用NSSetUncaughtExceptionHandler和标准的Unix信号处理机制来实现。这能帮助你记录绝大部分的崩溃信息。以下是详细的实现步骤和代码示例&#xff1a; 一、系统崩溃处理 通过NSSetUncaug…...

雪花算法(Snowflake Algorithm)

雪花算法&#xff08;Snowflake Algorithm&#xff09;是一种分布式唯一ID生成算法&#xff0c;主要用于生成全球唯一的ID&#xff0c;广泛应用于分布式系统中&#xff0c;例如在数据库中作为主键。这个算法最初由Twitter提出&#xff0c;并且被广泛使用在很多大规模系统中。有…...

〖任务1〗ROS2 jazzy Linux Mint 22 安装教程

前言&#xff1a; 本教程在Linux系统上使用。 目录 一、linux安装二、linux VPN安装三、linux anaconda安装&#xff08;可选&#xff09;四、linux ROS2 安装五、rosdep init/update 解决方法六、安装GUI 一、linux安装 移动硬盘安装linux&#xff1a;[LinuxToGo教程]把ubunt…...

图像增强:使用周围像素填充掩码区域

制作图像需要填充的掩码区域,对需要填充的位置的mask赋值非0,不需要填充赋值为0使用cv2.inpaint对图像掩码mask中非0元素位置的图像像素进行修复。从而实现使用周围像素填充掩码区域cv2.inpaint 是 OpenCV 库中的一个函数,用于图像修复(inpainting),即填充图像中的损坏区…...

给虚拟机Ubuntu扩展硬盘且不丢数据

1.Ubuntu关机状态下先扩展&#xff0c;如扩展20GB 2.进入ubuntu&#xff0c;切换root登录&#xff0c;必须是root全选&#xff0c;否则启动不了分区工具gparted 将新的20GB创建好后&#xff0c;选择ext4,primary&#xff1b; 3.永久挂载 我的主目录在/并挂载到/dev/sda1 从图…...

Oracle(41)如何使用PL/SQL批量处理数据?

在PL/SQL中&#xff0c;批量处理数据是一种高效的方法&#xff0c;可以在数据库中处理大量数据&#xff0c;而无需逐行操作。批量处理数据的关键技术包括&#xff1a; PL/SQL表&#xff08;索引表&#xff09;&#xff1a;在内存中存储数据以进行批量操作。FORALL语句&#xf…...

JavaEE 第2节 线程安全知识铺垫1

目录 一、通过jconsole.exe查看线程状态的方法 二、Thread类的几种常见属性 三、线程状态 一、通过jconsole.exe查看线程状态的方法 通过jconsole查看线程状态非常实用的方式 只要你安装了jdk&#xff0c;大致按照这个目录就可以找到这个可执行程序&#xff1a; 然后双击这…...

LeetCode Hot100 零钱兑换

给你一个整数数组 coins &#xff0c;表示不同面额的硬币&#xff1b;以及一个整数 amount &#xff0c;表示总金额。 计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额&#xff0c;返回 -1 。 你可以认为每种硬币的数量是无限的。 示…...

微信小程序接口实现语音转文字

一、效果展示 我们有一个按钮&#xff0c;点击“开始录音”按钮&#xff0c;此时按钮变成“停止录音”并开始计时&#xff0c;点击停止录音后&#xff0c;界面上即可展示返回的文字 二、代码实现 完整代码实现见github 1.小程序端代码 // index.js const recorderManager…...

[Spark Streaming] 读取 Kafka 消息, 插入到 MySQL

以下是一个简单的使用 Spark Streaming 读取 Kafka 消息、统计数据后插入到 MySQL 中的 Scala 代码示例&#xff1a; import org.apache.spark.SparkConf import org.apache.spark.streaming.{Seconds, StreamingContext} import org.apache.spark.streaming.kafka.KafkaUtils…...

精选3款国内wordpress 主题,建站首选

WordPress作为一款功能强大且易于使用的建站平台&#xff0c;已经成为了许多企业和个人搭建网站的首选。为了帮助大家更好地选择适合自己的WordPress主题&#xff0c;小编将为大家推荐三款国内优秀的WordPress主题&#xff1a;子比主题、OneNav主题和RiTheme主题。 1.子比主题…...

JavaScript之 Uint8Array 类型数组(solana pda场景中的大小端)

文章目录 JavaScript之 Uint8Array 类型数组numberToUint8Array 数字转换为Uint8Array为什么要把数字转换为Uint8Array数字转换为Uint8Array的大小端问题solana pda场景中的大小端JavaScript之 Uint8Array 类型数组 Uint8Array 数组类型表示一个8位无符号整型数组,创建时内容…...

《Windows API每日一练》24.1 WinSock简介

本节将逐一介绍WinSock的主要特性和组件&#xff0c;套接字、WinSock动态库的使用。 本节必须掌握的知识点&#xff1a; Windows Socket接口简介 Windows Socket接口的使用 第178练&#xff1a;网络时间校验 24.1.1 Windows Socket接口简介 ■以下是WinSock的主要特性和组件…...

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周&#xff0c;有很多同学在写期末Java web作业时&#xff0c;运行tomcat出现乱码问题&#xff0c;经过多次解决与研究&#xff0c;我做了如下整理&#xff1a; 原因&#xff1a; IDEA本身编码与tomcat的编码与Windows编码不同导致&#xff0c;Windows 系统控制台…...

Java 8 Stream API 入门到实践详解

一、告别 for 循环&#xff01; 传统痛点&#xff1a; Java 8 之前&#xff0c;集合操作离不开冗长的 for 循环和匿名类。例如&#xff0c;过滤列表中的偶数&#xff1a; List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...

使用分级同态加密防御梯度泄漏

抽象 联邦学习 &#xff08;FL&#xff09; 支持跨分布式客户端进行协作模型训练&#xff0c;而无需共享原始数据&#xff0c;这使其成为在互联和自动驾驶汽车 &#xff08;CAV&#xff09; 等领域保护隐私的机器学习的一种很有前途的方法。然而&#xff0c;最近的研究表明&…...

汽车生产虚拟实训中的技能提升与生产优化​

在制造业蓬勃发展的大背景下&#xff0c;虚拟教学实训宛如一颗璀璨的新星&#xff0c;正发挥着不可或缺且日益凸显的关键作用&#xff0c;源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例&#xff0c;汽车生产线上各类…...

Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器

第一章 引言&#xff1a;语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域&#xff0c;文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量&#xff0c;支撑着搜索引擎、推荐系统、…...

Neo4j 集群管理:原理、技术与最佳实践深度解析

Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...

Angular微前端架构:Module Federation + ngx-build-plus (Webpack)

以下是一个完整的 Angular 微前端示例&#xff0c;其中使用的是 Module Federation 和 npx-build-plus 实现了主应用&#xff08;Shell&#xff09;与子应用&#xff08;Remote&#xff09;的集成。 &#x1f6e0;️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...

2025季度云服务器排行榜

在全球云服务器市场&#xff0c;各厂商的排名和地位并非一成不变&#xff0c;而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势&#xff0c;对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析&#xff1a; 一、全球“三巨头”…...

《C++ 模板》

目录 函数模板 类模板 非类型模板参数 模板特化 函数模板特化 类模板的特化 模板&#xff0c;就像一个模具&#xff0c;里面可以将不同类型的材料做成一个形状&#xff0c;其分为函数模板和类模板。 函数模板 函数模板可以简化函数重载的代码。格式&#xff1a;templa…...

Vite中定义@软链接

在webpack中可以直接通过符号表示src路径&#xff0c;但是vite中默认不可以。 如何实现&#xff1a; vite中提供了resolve.alias&#xff1a;通过别名在指向一个具体的路径 在vite.config.js中 import { join } from pathexport default defineConfig({plugins: [vue()],//…...