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

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

六大排序算法

  • 一.插入排序
      • 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));}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/480079.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Linux】剧幕中的灵魂更迭:探索Shell下的程序替换

&#x1f3ac; 个人主页&#xff1a;谁在夜里看海. &#x1f4d6; 个人专栏&#xff1a;《C系列》《Linux系列》《算法系列》 ⛰️ 一念既出&#xff0c;万山无阻 目录 &#x1f4d6;一、进程程序替换 1.替换的演示 ❓替换与执行流 ❓程序替换≠进程替换 2.替换的原理 …

python爬虫案例——猫眼电影数据抓取之字体解密,多套字体文件解密方法(20)

文章目录 1、任务目标2、网站分析3、代码编写1、任务目标 目标网站:猫眼电影(https://www.maoyan.com/films?showType=2) 要求:抓取该网站下,所有即将上映电影的预约人数,保证能够获取到实时更新的内容;如下: 2、网站分析 进入目标网站,打开开发者模式,经过分析,我…

iscsi服务器

Iscsi 服务端 Iscsi客户端 Iscsi 客户端 创建lvm卷 安装iscsi服务端工具 创建lvm 用之前创建的lvm卷 创建服务端标识 创建客户端标识 Ls查看 删除之前的ip标识 创建服务端ip 和端口 创建双向认证用户名和密码 配置完后exit退出&#xff0c; 重启systemctl restart targe…

用shell脚本写一个通用的监听程序异常并重启脚本

进来服务器的程序php-fpm时常在并发下时常挂掉&#xff0c;而且时常在凌晨2点以后&#xff0c;通过排查是因为php配置需要调整并发&#xff0c;同时&#xff0c;为了不影响我休息&#xff08;以前老师说&#xff1a;能用机器和程序解决问题的坚决不用人去操作&#xff0c;这样才…

CA系统(file.h---申请认证的处理)

#pragma once #ifndef FILEMANAGER_H #define FILEMANAGER_H #include <string> namespace F_ile {// 读取文件&#xff0c;返回文件内容bool readFilename(const std::string& filePath);bool readFilePubilcpath(const std::string& filePath);bool getNameFro…

02-Linux系统权限维持

02-Linux系统权限维持 一 创建账号 1 在/etc/passwd中创建root的特权用户 /etc/passwd中数据的格式 账号:密码:uid:gid:描述:家目录:shell解释器&#xff0c;我们可以在/etc/passwd文件中添加一个test账号&#xff0c;密码为password123&#xff08;密文advwtv/9yU5yQ&#…

AWS codebuild + jenkins + github 实践CI/CD

前文 本文使用 Jenkins 结合 CodeBuild, CodeDeploy 实现 Serverless 的 CI/CD 工作流&#xff0c;用于自动化发布已经部署 lambda 函数。 在 AWS 海外区&#xff0c;CI/CD 工作流可以用 codepipeline 这项产品来方便的实现&#xff0c; CICD 基本概念 持续集成( Continuous…

[AutoSar]BSW_Diagnostic_007 BootLoader 跳转及APP OR boot response 实现

目录 关键词平台说明背景一、Process Jump to Bootloader二、相关函数和配置2.1 Dcm_GetProgConditions()2.2 Dcm_SetProgConditions() 三、如何实现在APP 还是BOOT 中对10 02服务响应3.1 配置3.2 code 四、报文五、小结 关键词 嵌入式、C语言、autosar、OS、BSW、UDS、diagno…

重塑用户体验!快手电商智能巡检平台的实践与探索

导读&#xff1a;随着科技的飞速发展&#xff0c;人工智能&#xff08;AI&#xff09;已经成为推动各行各业创新的重要力量。特别是在用户体验方面&#xff0c;AI 技术的应用不仅解决了许多传统问题&#xff0c;还带来了全新的交互方式和更高的用户满意度。本文将从快手电商B端…

sin函数拟合

目录 一、 目的... 1 二、 模型设计... 1 2.1 输入与输出.... 1 2.2 隐藏层设计.... 1 2.3 优化算法与损失函数.... 1 2.4 神经网络结构.... 1 三、 训练... 1 3.1 数据生成.... 2 3.2 训练过程.... 2 3.3 训练参数与设置.... 2 四、 测试与分析... 2 4.1 选取不同激活函数....…

【鸿蒙】鸿蒙开发过程中this指向问题

文章目录 什么是 this&#xff1f;常见 this 指向问题案例分析&#xff1a;HarmonyOS 组件中的 this 指向问题问题描述问题分析原因 解决方案&#xff1a;绑定 this 的正确方法方法一&#xff1a;使用箭头函数方法二&#xff1a;手动绑定 this 完整代码示例使用箭头函数使用 bi…

【摸鱼】Docker配置主从mysql数据库环境

docker pull mysql拉取docker镜像&#xff0c;国内现在访问不了docker hub&#xff0c;可以去阿里云上镜像加速器地址https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors启动主库docker run -p 3306:3306 --name master-mysql --privilegedtrue -v /app/docker/data…

初试无监督学习 - K均值聚类算法

文章目录 1. K均值聚类算法概述2. k均值聚类算法演示2.1 准备工作2.2 生成聚类用的样本数据集2.3 初始化KMeans模型对象&#xff0c;并指定类别数量2.4 用样本数据训练模型2.5 用训练好的模型生成预测结果2.6 输出预测结果2.7 可视化预测结果 3. 实战小结 1. K均值聚类算法概述…

大数据笔记

第一章、大数据概述 人类的行为及产生的事件的一种记录称之为数据。 1、大数据时代的特征&#xff0c;并结合生活实例谈谈带来的影响。 &#xff08;一&#xff09;特征 1、Volume 规模性&#xff1a;数据量大。 2、Velocity高速性&#xff1a;处理速度快。数据的生成和响…

深度学习实战老照片上色

目录 1.研究背景与意义1. 卷积神经网络&#xff08;CNN&#xff09;在老照片上色中的应用1.1 卷积层与特征提取1.2 颜色空间转换1.3 损失函数与训练优化 2. 生成对抗网络&#xff08;GAN&#xff09;在老照片上色中的应用2.1 生成器与判别器2.2 对抗训练2.3 条件生成对抗网络&a…

C#面向对象,封装、继承、多态、委托与事件实例

一&#xff0e;面向对象封装性编程 创建一个控制台应用程序&#xff0c;要求&#xff1a; 1&#xff0e;定义一个服装类&#xff08;Cloth&#xff09;&#xff0c;具体要求如下 &#xff08;1&#xff09;包含3个字段&#xff1a;服装品牌&#xff08;mark&#xff09;,服装…

养老院、学校用 安科瑞AAFD-40Z单相电能监测故障电弧探测器

安科瑞戴婷 Acrel-Fanny 安科瑞单相电能监测故障电弧探测器对接入线路中的故障电弧&#xff08;包括故障并联电弧、故障串联电弧&#xff09;进行有效的检测&#xff0c;当检测到线路中存在引起火灾的故障电弧时&#xff0c;探测器可以进行现场的声光报警&#xff0c;并将报警…

PAT甲级 1056 Mice and Rice(25)

文章目录 题目题目大意基本思路AC代码总结 题目 原题链接 题目大意 给定参赛的老鼠数量为NP&#xff0c;每NG只老鼠分为一组&#xff0c;组中最胖的老鼠获胜&#xff0c;并进入下一轮&#xff0c;所有在本回合中失败的老鼠排名都相同&#xff0c;获胜的老鼠继续每NG只一组&am…

[SWPUCTF 2021 新生赛]include

参考博客: 文件包含 [SWPUCTF 2021 新生赛]include-CSDN博客 NSSCTF | [SWPUCTF 2021 新生赛]include-CSDN博客 考点:php伪协议和文件包含 PHP伪协议详解-CSDN博客 php://filter php://filter可以获取指定文件源码。当它与包含函数结合时&#xff0c;php://filter流会被当…

spring boot3.3.5 logback-spring.xml 配置

新建 resources/logback-spring.xml 控制台输出颜色有点花 可以自己更改 <?xml version"1.0" encoding"UTF-8"?> <!--关闭文件扫描 scanfalse --> <configuration debug"false" scan"false"><springProperty …