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

六大排序算法:插入排序、希尔排序、选择排序、冒泡排序、堆排序、快速排序

本章讲述数据结构中的六大排序算法
欢迎大佬们踊跃讨论,感谢大家支持!
我的博客主页链接
在这里插入图片描述

六大排序算法

  • 一.插入排序
      • 1.1 直接插入排序
      • 1.2 希尔排序
  • 二.选择排序
      • 2.1 单向选择排序
      • 2.2双向选择排序
      • 2.3 堆排序
  • 三.交换排序
      • 3.1 冒泡排序
      • 3.2 快速排序
        • 3.2.1 Hoare排序
        • 3.2.2 挖坑法
        • 3.2.3 前后指针法
        • 3.4 非递归快速排序
  • 四.归并排序
    • 4.1 递归归并排序
    • 4.2非递归归并排序
  • 五.测试运行时间代码

一.插入排序

1.1 直接插入排序

1.已知第一个元素如果不包含其他元素,没有元素可以比较,为有序。
2.我们可以直接从第二个元素i开始,创建一个对象tmp来接下标元素,如果比前一个元素小,前一个元素往后移动,tmp插入i-1下标
3.当元素大于或者等于时,则tmp直接放在i位置即可。
在这里插入图片描述

  public static void insertSort(int[] array){for(int i=1;i<array.length;i++){//由数组1下标开始进行比较int tmp=array[i];int j=i-1;for(;j>=0;j--){if(tmp<array[j]){array[j+1]=array[j];//将j放入j+1位置}else{//进入else则为有序,break跳出嵌套循环break;}}//当嵌套的for循环一直在比较最小值tmp,知道为-1跳出循环,这里需要j+1//当大于时候,因为i-1赋值给j,break跳出后j需要+1下标值得到tmparray[j+1]=tmp;}}

时间复杂度:最坏情况时间复杂度为O(N*N)
最好情况时间复杂度为O(N)
空间复杂度O(1)
稳定排序

1.2 希尔排序

希尔排序又称缩小增量法。
希尔排序的思想,定义一个整数,将待排序数组元素长度分成多个组,每一个组进行插入排序,重复上述分组,此时为预排序。当到达1时,将所有记录好的元素在一组中进行排序。
每一次分组排序后都变为有序,每组数据由少变多,越来越有序。
在这里插入图片描述
划分为n/2组进行比较,根据n/2的距离来划分每一组的数量。
在这里插入图片描述

   public static void shellSort(int[] array){int gap=array.length;while(gap>1){gap/=2;//将数组/2,有多组变少组直到为1shell(array,gap);}}public static void shell(int[] arr,int gap){//从gap开始遍历for(int i=gap;i<arr.length;i++){//获取gap下标的值int tmp=arr[i];求i-gap个差距得到j值int j=i-gap;for(;j>=0;j-=gap){if(tmp<arr[j]){arr[j+gap]=arr[j];}else{break;}}arr[j+gap]=tmp;}}

时间复杂度O(N^1.25)
空间复杂度O(1)

二.选择排序

2.1 单向选择排序

单向选择排序通过定义minIndex值来获取最小的元素下标,然后与0下标进行交换
在这里插入图片描述

   public static void selectSort2(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[minIndex]){minIndex=j;}}swap(array,minIndex,i);}}

2.2双向选择排序

双向选择排序是我们通过定义起始位置和终点位置的下标作为条件,通过初始位置筛选最大值和最小值的下标,将最大值下标与尾部交换,最小值下标与初始位置交换,然后继续重复上述,知道筛选完成。
在这里插入图片描述
这里如果max的最大值为0下标的时候,max已经被 minIndex交换,maxIndex等于minIndex获取最大元素的下标值即可。

在这里插入图片描述

 public static void selectSort(int[] array){//起始位置和末尾的下标值int left=0;int right=array.length-1;while(left<right){//都从0下标开始比较int maxIndex=left;int minIndex=left;for(int i=left+1;i<=right;i++){if(array[i]<array[minIndex]) minIndex=i;if(array[i]>array[maxIndex]) maxIndex=i;}swap(array,left,minIndex);//如果0下标就是maxIndex的最大值,minIndex的位置就是maxIndex的最大值if(maxIndex==left)maxIndex=minIndex;swap(array,right,maxIndex);left++;right--;}}

时间复杂度:O(N^2)
空间复杂度:O(1)

2.3 堆排序

堆序详情堆排序

 //创建二叉堆public static void createHeap(int[] array){for(int parent=(array.length-1-1)/2;parent>=0;parent--){siftDown(array,parent,array.length);}}private static void siftDown(int[] array,int parent,int size) {int child=2*parent+1;while(child<size){if(child+1<size&&array[child]<array[child+1]){//child是左右孩子的最大值child=child+1;}if(array[child]>array[parent]){//交换孩子与父亲swap(array,child,parent);//调整父亲节点和孩子节点parent=child;child=(2*parent)+1;}else{break;}}}//根据创建好的大跟堆,通过最后一个下标与0下标交换后缩小堆的范围,直到称为有序数组public static void heapSort(int[] array){createHeap(array);int end=array.length-1;while(end>0){swap(array,0,end);siftDown(array,0,end);end--;}}

时间复杂度O(N*logN)
空间复杂度O(1)

三.交换排序

3.1 冒泡排序

冒泡排序是一种较为简单的排序算法,它循环需要排序的元素,依次比较相邻的两个元素,如果顺序错误就进行交换,直至没有元素交换,完成排序,若对数组n个元素进行比较,则需要比较n-1次,最后一个元素已经被前n-1个元素排序好。
排序一次将len-1最大值放到最后,直到有序
本代码中的flag来记录是否有序,如果有序,则直接跳出循环。
在这里插入图片描述

 public static void bubbleSort(int[] array){for(int i=0;i<array.length-1;i++){boolean flag=false;//这里标记一下,每一趟中,给flag置为false,当每趟为有序后,则不进入if语句直接停止循环for(int j=0;j<array.length-1-i;j++){if(array[j]>array[j+1]){swap(array,j,j+1);flag=true;}}if(!flag){break;}}}

时间复杂度:最好情况下:O(n)
最坏情况下:O(n^2)
空间复杂度:O(1)
稳定排序

3.2 快速排序

3.2.1 Hoare排序

1.首先设定一个分界值,通过该分界值将数组分成左右两部分。
2、将大于或等于分界值的数据集中到数组右边,小于分界值的数据集中到数组的左边。此时,左边部分中各元素都小于分界值,而右边部分中各元素都大于或等于分界值。
3、然后,左边和右边的数据可以独立排序。对于左侧的数组数据,又可以取一个分界值,将该部分数据分成左右两部分,同样在左边放置较小值,右边放置较大值。右侧的数组数据也可以做类似处理。
4、重复上述过程,可以看出,这是一个递归定义。通过递归将左侧部分排好序后,再递归排好右侧部分的顺序。当左、右两个部分各数据排序完成后,整个数组的排序也就完成了。
在这里插入图片描述

在这里插入图片描述
这里定义一个left为左,right为右,将任意左右位置两边定义一个基准值,根据基准值的大小,直到left为大于基准值数,right为小于基准值数停下,若定义左边为基准值则右边先走,同理右边为基准值左边先走

 //快速排序public static void quickSort(int[] array){//记录左起始位置和右边的结束位置进行递归quick(array,0,array.length-1);}
public static void inSert(int[] array,int left,int right){for(int i=left+1;i<=right;i++){int tmp=array[i];int j=i-1;for(;j>=left;j--){if(array[j]>tmp){array[j+1]=array[j];}else {break;}}array[j+1]=tmp;}}private static void quick(int[] array, int left, int right) {if(left>=right)return ;//说明两个相遇或者走出范围//当长度少时直接插入排序if(right-left+1<=10){inSert(array,left,right);return ;}int index = middleNum(array,left,right);System.out.println("index下标值:"+index);//用来交换left和right范围内元素且最终将首位元素与相遇值交换swap(array,left,index);int pos=partitionPointer(array,left,right);//递归quick(array,left,pos-1);quick(array,pos+1,right);}private static int partitionHoare(int[] array, int left, int right) {int record=left;//记录left最后交换int tmp=array[left];//比较大小while(left<right){while(left<right&&array[right]>=tmp){//右边找到小于tmpright--;}while(left<right&&array[left]<=tmp){//左边找到大于tmpleft++;}swap(array,left,right);}//这里left与right相遇swap(array,record,left);return left;}

时间复杂度:最坏情况下N*(logN)
最好情况下:O(N^2) 有序或者逆序情况下
空间复杂度:最好情况下O(logN)
最坏情况下:O(N) 有序或者逆序情况下
数据多时因递归可能容易栈溢出

3.2.2 挖坑法

1.由左或者右选出第一个坑位记录元素值,放入key中,创建left和right对数组遍历,当选左坑右走,右坑左走,直到right和left相遇后将记录的坑位元素值放入即可。
在这里插入图片描述

 public static void quickSort(int[] array){//记录左起始位置和右边的结束位置进行递归quick(array,0,array.length-1);}public static void inSert(int[] array,int left,int right){for(int i=left+1;i<=right;i++){int tmp=array[i];int j=i-1;for(;j>=left;j--){if(array[j]>tmp){array[j+1]=array[j];}else {break;}}array[j+1]=tmp;}}private static void quick(int[] array, int left, int right) {if(left>=right)return ;//说明两个相遇或者走出范围if(right-left+1<=10){inSert(array,left,right);return ;}int index = middleNum(array,left,right);System.out.println("index下标值:"+index);//用来交换left和right范围内元素且最终将首位元素与相遇值交换swap(array,left,index);int pos=partitionPointer(array,left,right);//递归quick(array,left,pos-1);quick(array,pos+1,right);}private static int partitionPit(int[] array, int left, int right) {int record=array[left];//记录起始坑位while(left<right){while(left<right&&array[right]>=record){//右边找到小于tmpright--;}//说明找到小于tmp的值array[left]=array[right];while(left<right&&array[left]<=record){//左边找到大于tmpleft++;}//说明找到大于tmp的值array[right]=array[left];}//这里left与right相遇后将记录的首个坑填入array[left]=record;return left;}
3.2.3 前后指针法

cur指向起始位置+1,pre是cur的前一位
判断条件:如果cur找到基准值(最初位置key为5),前一项的条件满足后prev向后走不为cur(为cur则不交换),直到prev在前cur在后且cur<基准值
cur如果大于基准值,直到cur找到小于基准值的数或者走完,直到递归调整为升序。
在这里插入图片描述

   public static void quickSort(int[] array){//记录左起始位置和右边的结束位置进行递归quick(array,0,array.length-1);}public static void inSert(int[] array,int left,int right){for(int i=left+1;i<=right;i++){int tmp=array[i];int j=i-1;for(;j>=left;j--){if(array[j]>tmp){array[j+1]=array[j];}else {break;}}array[j+1]=tmp;}}private static void quick(int[] array, int left, int right) {if(left>=right)return ;//说明两个相遇或者走出范围if(right-left+1<=10){inSert(array,left,right);return ;}int index = middleNum(array,left,right);System.out.println("index下标值:"+index);//用来交换left和right范围内元素且最终将首位元素与相遇值交换swap(array,left,index);int pos=partitionPointer(array,left,right);//递归quick(array,left,pos-1);quick(array,pos+1,right);}private static int partitionPointer(int[] array, int left, int right) {//记录cur的前一项int Prev=left;int cur=left+1;while(cur<=right){//cur与起始位置比较只有小于才能进行交换且prev不为curif(array[cur]<array[left]&&array[++Prev]!=array[cur]){swap(array,cur,Prev);}cur++;}//交换最后记录的cur的值swap(array,left,Prev);return Prev;}
3.4 非递归快速排序

这里非递归排序的情况下,因为每次最左边的数我们需要申请一个栈来记录其区间值,出栈由区间值一步步缩小取值的范围并进行交换,重复上述即可。

 public static void quickNor(int[] array){quickSortNor(array,0,array.length-1);}private static void quickSortNor(int[] array, int left, int right) {Stack<Integer> stack=new Stack<>();int pivot=partitionHoare(array,left,right);if(pivot>left+1){stack.push(left);stack.push(pivot-1);}if(pivot+1<right){stack.push(pivot+1);stack.push(right);}while(!stack.isEmpty()){right = stack.pop();left = stack.pop();pivot=partitionHoare(array,left,right);if(pivot>left+1){stack.push(left);stack.push(pivot-1);}if(pivot+1<right){stack.push(pivot+1);stack.push(right);}}

四.归并排序

4.1 递归归并排序

定义一个分界线mid来获取其中间值,递归左边和右边,每次进入方法进行排序
将左起始到中间值与中间值到右侧比较,创建一个数组来记录,排序后放到数组中,最后让原数组接收。

    public static void mergeSort(int[] array){mergeSortM(array,0,array.length-1);}private static void mergeSortM(int[] array, int left, int right) {//知道left和right相遇返回if(left>=right)return ;int mid=(left+right)/2;//以中间值作为分区,递归左边和右边mergeSortM(array,left,mid);mergeSortM(array,mid+1,right);//每次递归传入后进行排序merge(array,left,mid,right);}private static void merge(int[] array, int left, int mid, int right) {int[] tmpArr=new int[right-left+1];//创建一个数组接收每一次递归的数组int k=0;//记录左边的起始位置与右边起始位置int s1=left;int s2=mid+1;while(s1<= mid &&s2<= right){if(array[s1]<=array[s2]){tmpArr[k++]=array[s1++];}else{tmpArr[k++]=array[s2++];}}while(s1<= mid){tmpArr[k++]=array[s1++];}while(s2<= right){tmpArr[k++]=array[s2++];}for(int i=0;i<tmpArr.length;i++){//这里的left跟随着mid改变,当递归右侧时,left为mid+1array[i+left]=tmpArr[i];}}
}

时间复杂度:O(N*logN)
空间复杂度:O(logN)
稳定排序

4.2非递归归并排序

  private static void merge(int[] array, int left, int mid, int right) {int[] tmpArr=new int[right-left+1];//创建一个数组接收每一次递归的数组int k=0;//记录左边的起始位置与右边起始位置int s1=left;int s2=mid+1;while(s1<= mid &&s2<= right){if(array[s1]<=array[s2]){tmpArr[k++]=array[s1++];}else{tmpArr[k++]=array[s2++];}}while(s1<= mid){tmpArr[k++]=array[s1++];}while(s2<= right){tmpArr[k++]=array[s2++];}for(int i=0;i<tmpArr.length;i++){array[i+left]=tmpArr[i];}}public static void mergeNor(int[] array){int gap=1;//每组共有几个数据while(gap<array.length){for(int i=0;i<array.length;i=i+gap*2){int left=i;int mid=left+gap-1;int right=mid+gap;if(mid>=array.length)mid=array.length-1;if(right>=array.length){right=array.length-1;}merge(array,left,mid,right);}gap*=2;}}

五.测试运行时间代码

  // 有序public static void order(int[] arr){for(int i=0;i<arr.length;i++){arr[i]=i;}}//逆序public static void reverse(int[] arr){for(int i=0;i<arr.length;i++){arr[i]= arr.length-i;}}//无序public static void disorder(int[] arr){Random random=new Random();for(int i=0;i<arr.length;i++){arr[i]= random.nextInt(100);}}//测试public static void testSort1(int[] arr){int[] tmpArray= Arrays.copyOf(arr,arr.length);long startTime=System.currentTimeMillis();//开始结束记录Sort.shellSort(tmpArray);long endTime=System.currentTimeMillis();System.out.println("希尔排序时间:"+(endTime-startTime));}public static void testSort2(int[] arr){int[] tmpArray= Arrays.copyOf(arr,arr.length);long startTime=System.currentTimeMillis();//开始结束记录Sort.inSert(tmpArray);long endTime=System.currentTimeMillis();System.out.println("插入排序时间:"+(endTime-startTime));}public static void testSort3(int[] arr){int[] tmpArray= Arrays.copyOf(arr,arr.length);long startTime=System.currentTimeMillis();//开始结束记录Sort.selectSort2(tmpArray);long endTime=System.currentTimeMillis();System.out.println("双向选择排序时间:"+(endTime-startTime));}public static void testSort4(int[] arr){int[] tmpArray= Arrays.copyOf(arr,arr.length);long startTime=System.currentTimeMillis();//开始结束记录Sort.bubbleSort(tmpArray);long endTime=System.currentTimeMillis();System.out.println("冒泡排序时间:"+(endTime-startTime));}public static void testSort5(int[] arr){int[] tmpArray= Arrays.copyOf(arr,arr.length);long startTime=System.currentTimeMillis();//开始结束记录Sort.heapSort(tmpArray);long endTime=System.currentTimeMillis();System.out.println("堆排序时间:"+(endTime-startTime));}public static void testSort6(int[] arr){int[] tmpArray= Arrays.copyOf(arr,arr.length);long startTime=System.currentTimeMillis();//开始结束记录Sort.quickSort(tmpArray);long endTime=System.currentTimeMillis();System.out.println("Hoare快速排序时间:"+(endTime-startTime));}public static void testSort7(int[] arr){int[] tmpArray= Arrays.copyOf(arr,arr.length);long startTime=System.currentTimeMillis();//开始结束记录Sort.quickSort(tmpArray);long endTime=System.currentTimeMillis();System.out.println("挖坑法快速排序时间:"+(endTime-startTime));}public static void testSort8(int[] arr){int[] tmpArray= Arrays.copyOf(arr,arr.length);long startTime=System.currentTimeMillis();//开始结束记录Sort.quickSort(tmpArray);long endTime=System.currentTimeMillis();System.out.println("前后指针法快速排序时间:"+(endTime-startTime));}

相关文章:

六大排序算法:插入排序、希尔排序、选择排序、冒泡排序、堆排序、快速排序

本章讲述数据结构中的六大排序算法 欢迎大佬们踊跃讨论&#xff0c;感谢大家支持&#xff01; 我的博客主页链接 六大排序算法 一.插入排序1.1 直接插入排序1.2 希尔排序 二.选择排序2.1 单向选择排序2.2双向选择排序2.3 堆排序 三.交换排序3.1 冒泡排序3.2 快速排序3.2.1 Hoa…...

快速排序(C++实现)

基本思想 任取一个元素为中心&#xff0c;所有比它小的元素一律前放&#xff0c;比他大的元素一律后放&#xff0c;形成左右两个子表&#xff1b;对各子表重新选择中心元素并依此规则调整&#xff0c;直到每个子表的元素只剩一个。 通过一趟排序&#xff0c;将待排序记录分割成…...

【数据库知识】数据库关系代数表达式

文章目录 概述一、关系代数表达式的基本组成部分二、关系代数运算符及其使用样例三、关系代数表达式的优化四、总结 概述 数据库关系代数表达式是关系数据库系统查询语言的理论基础&#xff0c;它使用一系列符号和运算符来描述从一个或多个关系&#xff08;即表&#xff09;中…...

linux系统清理全部python环境并重装

提问 centos系统清理全部python环境并重装&#xff0c;并且使用宝塔。 解答 要在CentOS系统中彻底清理Python3环境&#xff0c;可以遵循以下步骤&#xff1a; 卸载Python3 使用rpm命令卸载所有与Python3相关的包。这个命令会查询所有已安装的与python3相关的rpm包&#xf…...

Servlet的介绍

Servlet是Java Web的核心组件&#xff0c;它是一个运行在服务器端的Java程序&#xff0c;用于接收客户端的请求、处理请求并返回响应。Servlet遵循特定的生命周期&#xff0c;包括初始化、服务、销毁等阶段。 生命周期&#xff1a; init()&#xff1a;初始化Servlet实例&#x…...

DICOM医学影像应用篇——伪彩色映射 在DICOM医学影像中的应用详解

目录 引言 伪彩色映射的概念 基本原理 查找表&#xff08;Look-Up Table, LUT&#xff09; 步骤 示例映射方案 实现伪彩色映射的C代码 代码详解 伪彩色处理效果展示 总结 扩展知识 LUT 的基本概念 LUT 在伪彩色映射中的应用 示例 引言 在医学影像处理中&#xff0c…...

(超详细图文详情)Navicat 配置连接 Oracle

1、下载依赖文件 Oracle官网下载直链&#xff1a;https://www.oracle.com/database/technologies/instant-client/winx64-64-downloads.html 夸克网盘下载&#xff08;oracle19c版本&#xff09;&#xff1a;https://pan.quark.cn/s/5061e690debc 官网下载选择对应 Oracle 版…...

PyTorch:神经网络的基本骨架 nn.Module的使用

神经网络的基本骨架 nn.Module的使用 为了更全面地展示如何使用 nn.Module 构建一个适用于现代图像处理任务的卷积神经网络&#xff08;CNN&#xff09;&#xff0c;我们将设计一个针对手写数字识别&#xff08;如MNIST数据集&#xff09;的简单CNN模型。CNN非常适合处理图像数…...

学习threejs,使用CubeCamera相机创建反光效果

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言1.1 ☘️CubeCamera 立方体相机 二、…...

Linux网络——IO模型和多路转接

通常所谓的IO&#xff0c;其本质就是等待通信和进行通信&#xff0c;即IO 等 拷贝。 那么想要做到高效的IO&#xff0c;就要在单位时间内&#xff0c;减少“等”的比重。 一.五种IO模型 阻塞 IO: 在内核将数据准备好之前, 系统调用会一直等待. 所有的套接字, 默认都是阻塞方…...

【计网】自定义序列化反序列化(二) —— 实现网络版计算器【上】

&#x1f30e; 实现网络版计算器【上】 文章目录&#xff1a; 实现网络版计算器【上】 自定义协议       制定自定义协议 Jsoncpp序列化反序列化       Json::Value类       Jsoncpp序列化       Jsoncpp反序列化 自定义协议序列化反序列化      …...

数据结构2:顺序表

目录 1.线性表 2.顺序表 2.1概念及结构 2.2接口实现 1.线性表 线性表是n个具有相同特性的数据元素的有限序列。线性表是一种在实际中广泛使用的数据结构&#xff0c;常见的线性表&#xff1a;顺序表、链表、栈、队列、字符串 线性表在逻辑上是线性结构&#xff0c;也就说…...

python学习——元组

在 Python 中&#xff0c;元组&#xff08;tuple&#xff09;是一种内置的数据类型&#xff0c;用于存储不可变的有序元素集合。以下是关于 Python 元组的一些关键点&#xff1a; 文章目录 定义元组1. 使用圆括号 ()2. 使用 tuple() 函数3. 使用单个元素的元组4. 不使用圆括号…...

apache实现绑定多个虚拟主机访问服务

1个网卡绑定多个ip的命令 ip address add 192.168.45.140/24 dev ens33 ip address add 192.168.45.141/24 dev ens33 在linux服务器上&#xff0c;添加多个站点资料&#xff0c;递归创建三个文件目录 分别在三个文件夹下&#xff0c;建立测试页面 修改apache的配置文件http.…...

无需插件,如何以二维码网址直抵3D互动新世界?

随着Web技术的飞速发展&#xff0c;一个无需额外插件&#xff0c;仅凭二维码或网址即可直接访问的三维互动时代已经悄然来临。这一变革&#xff0c;得益于WebGL技术与先进web3D引擎的完美融合&#xff0c;它们共同构建了51建模网这样一个既便捷又高效的在线三维互动平台&#x…...

系统思考—感恩自己

生命中&#xff0c;真正值得我们铭记与感恩的&#xff0c;不是路途上的苦楚与风雨&#xff0c;而是那个在风雨中依然清醒、勇敢前行的自己&#xff0c;和那些一路同行、相互扶持的伙伴们。 感恩自己&#xff0c;感恩每一个与我们携手并进的人&#xff0c;也期待更多志同道合的…...

Java多线程详解①①(全程干货!!!) 实现简单的线程池 || 定时器 || 简单实现定时器 || 时间轮实现定时器

这里是Themberfue 上一节讲了 线程池 线程池中的拒绝策略 等相关内容 实现简单的线程池 一个线程池最核心的方法就是 submit&#xff0c;通过 submit 提交 Runnable 任务来通知线程池来执行 Runnable 任务 我们简单实现一个特定线程数量的线程池&#xff0c;这些线程应该在…...

DAMODEL丹摩|部署FLUX.1+ComfyUI实战教程

本文仅做测评体验&#xff0c;非广告。 文章目录 1. FLUX.1简介2. 实战2. 1 创建资源2. 1 ComfyUI的部署操作2. 3 部署FLUX.1 3. 测试5. 释放资源4. 结语 1. FLUX.1简介 FLUX.1是由黑森林实验室&#xff08;Black Forest Labs&#xff09;开发的开源AI图像生成模型。它拥有12…...

请求(request)

目录 前言 request概述 request的使用 获取前端传递的数据 实例 请求转发 特点 语法 实例 实例1 实例2 【关联实例1】 域对象 组成 作用范围&#xff1a; 生命周期&#xff1a; 使用场景&#xff1a; 使用步骤 存储数据对象 获得数据对象 移除域中的键值…...

关于VNC连接时自动断联的问题

在服务器端打开VNC Server的选项设置对话框&#xff0c;点左边的“Expert”&#xff08;专家&#xff09;&#xff0c;然后找到“IdleTimeout”&#xff0c;将数值设置为0&#xff0c;点OK关闭对话框。搞定。 注意,服务端有两个vnc服务,这俩都要设置ide timeout为0才行 附件是v…...

日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻

在如今就业市场竞争日益激烈的背景下&#xff0c;越来越多的求职者将目光投向了日本及中日双语岗位。但是&#xff0c;一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧&#xff1f;面对生疏的日语交流环境&#xff0c;即便提前恶补了…...

linux之kylin系统nginx的安装

一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源&#xff08;HTML/CSS/图片等&#xff09;&#xff0c;响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址&#xff0c;提高安全性 3.负载均衡服务器 支持多种策略分发流量…...

css实现圆环展示百分比,根据值动态展示所占比例

代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...

【Oracle APEX开发小技巧12】

有如下需求&#xff1a; 有一个问题反馈页面&#xff0c;要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据&#xff0c;方便管理员及时处理反馈。 我的方法&#xff1a;直接将逻辑写在SQL中&#xff0c;这样可以直接在页面展示 完整代码&#xff1a; SELECTSF.FE…...

UE5 学习系列(三)创建和移动物体

这篇博客是该系列的第三篇&#xff0c;是在之前两篇博客的基础上展开&#xff0c;主要介绍如何在操作界面中创建和拖动物体&#xff0c;这篇博客跟随的视频链接如下&#xff1a; B 站视频&#xff1a;s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...

全球首个30米分辨率湿地数据集(2000—2022)

数据简介 今天我们分享的数据是全球30米分辨率湿地数据集&#xff0c;包含8种湿地亚类&#xff0c;该数据以0.5X0.5的瓦片存储&#xff0c;我们整理了所有属于中国的瓦片名称与其对应省份&#xff0c;方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中&#xff0c;新增了一个本地验证码接口 /code&#xff0c;使用函数式路由&#xff08;RouterFunction&#xff09;和 Hutool 的 Circle…...

初学 pytest 记录

安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...

Linux 中如何提取压缩文件 ?

Linux 是一种流行的开源操作系统&#xff0c;它提供了许多工具来管理、压缩和解压缩文件。压缩文件有助于节省存储空间&#xff0c;使数据传输更快。本指南将向您展示如何在 Linux 中提取不同类型的压缩文件。 1. Unpacking ZIP Files ZIP 文件是非常常见的&#xff0c;要在 …...

云原生安全实战:API网关Kong的鉴权与限流详解

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关&#xff08;API Gateway&#xff09; API网关是微服务架构中的核心组件&#xff0c;负责统一管理所有API的流量入口。它像一座…...