《数据结构》八大排序(详细图文分析讲解)

news2025/1/29 14:09:05

目录

排序

排序的应用      

排序简介

排序的分类

排序算法的好坏评判

冒泡排序法 

思路分析

代码实现 

 选择排序法

思路分析

代码实现 

 插入排序

思路分析

代码实现 

希尔排序

思路分析

代码演示 

归并排序法 

思路分析

代码演示 

快速排序 

思路分析

代码实现 

堆积排序法

思路分析

代码实现 

基数排序法

思路分析

代码演示 

八大排序稳定性总结


排序

排序的应用      

        在信息时代的发展下 随着大时代和人工智能(Artificial Intelligence,AI)技术的普及和应用,企业所拥有的的数据量成倍数的增长,排序算法更是成为了不可或缺的重要工具之一

 那么排序会应用到什么地方呢?

        例如我们要去消费! 怎么消费?今天想去买个手机 那么我们要先打开购物平台,来搞一部iPhone14来耍一耍

         他们之间有一种筛选方式就为价格排序,我们来考虑优先价格的优势下靠谱的店家,再来点个外卖,他们之间的价格也可以形成排序 不单单是价格,销量、评分、星级的评比都会使用到排序

                                       

         再来往深处走一走,我们平时玩的游戏的场景也会遇到排序问题,在游戏中,需要处理多边形模型中隐藏面消除的过程中,不管场景中的多边形有没有挡住其他的多边形,只要按照从后面到前面的顺序的游戏中光栅化图形就可以正确的显示出所有课件的图形,其实就是可以沿着观察方向,按照多边形的深度信息对它们进行排序处理,这样就能形成我们可以看到的3D效果


 那么我们以下开始正文


排序简介

在排序的过程中,数据的移动方式可分为“直接移动”和“逻辑移动”

        直接移动:直接移动是直接交换存储数据的位置;

        逻辑移动:逻辑移动并不会移动数据的存储位置,仅改变指向这些数据的辅助指针的值;

优劣性:直接移动会浪费许多时间进行数据的移动,而逻辑移动只要改变辅助指针指向的位置就能轻易达到排序的目的

数据在进行排序后会有以下好处:

        ·数据较容易阅读

        ·数据有利于统计与整理

        ·可大幅减少数据查找的时间


排序的分类

排序按照执行使用的内存种类区可分为以下两种方式:

        ·内部排序:排序的数据量小,可以全部加载到内存中进行排序

        ·外部排序:排序的数据量大,无法一次性全部加载到内存中进行排序,而必须借助硬盘进               行排序

分享一个冷知识

 我们所知计算机中有以下存储类型,他们类似一个金字塔形状,首先运行速度是缓存区>内存>硬盘,但是存储大小缓存区<内存<硬盘

排序算法的好坏评判

        ·算法的稳定与否

        ·时间复杂度

        ·空间复杂度

是的 我们又回到了之前的内容,复杂度,如果对于复杂度理解还是比较浅薄的话 时间复杂度(点击即可进入博客)https://guobinglin.blog.csdn.net/article/details/125949648?spm=1001.2014.3001.5502  空间复杂度(点击即可进入博客)https://guobinglin.blog.csdn.net/article/details/127146252?spm=1001.2014.3001.5502

 

我们又可以串联起来之前的内容,这幅图中少了一项基数排序法,基数排序法属于高级排序,是一个稳定算法,时间复杂度最坏为O(N+R),空间复杂度为O(R)


冒泡排序法 

思路分析

        冒泡排序又称交换排序法,是从观察水中气泡变化构思而成,原理是从第一个元素开始,比较相邻元素的大小,若大小顺序有误,则对调后再进行下一个元素的比较,就仿佛气泡逐渐从水底上升到水面上一样

 

 

大概思路就是这样 我们只是简单的绘画一下 以下动图为一个数组完整的交换过程

代码实现 

public class Main {
    public static void main(String[] args) {
        int[] arr=new int[]{6,5,9,7,2,8};
        int i=0;
        int j=0;
        System.out.println("排序前");
        for(i=0;i<arr.length;i++){
            System.out.print(arr[i]+" ");
        }
        System.out.println();
        for (i = 0; i < arr.length - 1 ; i++) {
            for (j = 0; j < arr.length - i - 1; j++){
                if(arr[j]>arr[j+1]){
                    int tmp=arr[j];
                    arr[j]=arr[j+1];
                    arr[j+1]=tmp;
                }
            }
        }
        System.out.println("排序后");
        for(i=0;i<arr.length;i++){
            System.out.print(arr[i]+" ");
        }
        System.out.println();
    }
}

以上代码是为改进前的冒泡排序,他有一个缺点,就是不管数据是否已排序完成都会固定的执行n(n-1)/2次,我们仔细分析一下,在动图中,如果他有一次遍历没有发生任何的数据交换,那么代表已经有序了,我们来改进一下代码

public class Main {
    public static void main(String[] args) {
        int[] arr=new int[]{6,5,9,7,2,8};
        int i=0;
        int j=0;
        boolean fly;
        System.out.println("排序前");
        for(i=0;i<arr.length;i++){
            System.out.print(arr[i]+" ");
        }
        System.out.println();
        for (i = 0; i < arr.length - 1 ; i++) {
            fly=false;
            for (j = 0; j < arr.length - i - 1; j++){
                if(arr[j]>arr[j+1]){
                    fly=true;
                    int tmp=arr[j];
                    arr[j]=arr[j+1];
                    arr[j+1]=tmp;
                }
            }
            if(!fly){
                break;
            }
        }
        System.out.println("排序后");
        for(i=0;i<arr.length;i++){
            System.out.print(arr[i]+" ");
        }
        System.out.println();
    }
}

这样改进后会有概率使我们算法的时间复杂度大大降低 !


选择排序法

思路分析

选择排序法为在所有数据中,当从小到大排序,就设定一个哨兵去找出这个数组中的最小值,然后将这位最小值请到第一位,依次向后找第二位第三位,当从大到小排序那么理所应当就是去找最大值了 

再来一幅动图理解一下全过程

 

代码实现 

public class Main1 {
    public static void main(String[] args) {
        int[] arr=new int[]{9,7,5,3,4,6};
        System.out.println("排序前");
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i]+" ");
        }
        System.out.println();
        for (int i = 0; i <arr.length ; i++) {
            int min=i;
            for (int j = i; j <arr.length ; j++) {
                if(arr[j]<arr[min]){
                    min=j;
                }
            }
            if(min!=i){
                int tmp=arr[min];
                arr[min]=arr[i];
                arr[i]=tmp;
            }
        }
        System.out.println("排序后");
        for (int i = 0; i <arr.length ; i++) {
            System.out.print(arr[i]+" ");
        }
        System.out.println();
    }
}

运行结果


 插入排序

思路分析

插入排序法是将数组中的元素,逐一与已排序好的数据进行比较,前两个元素先排序好,再将第三个元素插入适当的位置,所以这三个元素仍然是已排序好的,接着再将第四个元素加入,重复此步骤,直到排序完成为止;

 以下为动图

代码实现 

 public static void main(String[] args) {
        int[] arr=new int[]{9,7,5,3,4,6};
        int j=0;
        System.out.println("排序前");
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i]+" ");
        }
        System.out.println();
        for (int i = 1; i < arr.length; i++) {
            int tmp=arr[i];
            for (j = i-1; j >=0 ; j--) {
                if(tmp<arr[j]){
                    arr[j+1]=arr[j];
                }else {
                    break;
                }
            }
            arr[j+1]=tmp;
        }
        System.out.println("排序后");
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i]+" ");
        }
    }

运行结果


希尔排序

思路分析

希尔排序可以减少插入排序法中的数据搬移的次数,以加速排序的进行,排序的原则是将数据区分成特定间隔的几块小区块,以插入排序拍完区块内的数据后再渐渐减少间隔的距离

(1)首先,将数据分为两块小区块即为Y=N/2(N为数组的长度)//划分不一定为2,指数最好,但是为了计算方便 我们习惯使用选择2 故一开始的话Y=8/2 Y=4 

(2)区分完成后我们可以得到分为了四个区块 他们内容分别为:(63、45)(92、71)(27、58)(26、7) 再分别使用插入排序法排序成 (45、63)(71、92)(27、58)(7、26),在队列中的数据排序为下图 

 (3)接着继续缩小间隔为(8/2)/2,如图所示

 (4)再继续使用插入排序,得到以下结果

 (5)再以((8/2)/2)/2继续进行插入排序 最后我们可以得到结果为:

代码演示 

 /**
     * 排序
     * @param data
     */
    public static void shell(int[] data){
        int i;//扫描次数
        int j;//j来定位比较的元素
        int k=1;//打印计数
        int tmp;//暂存
        int jmp=data.length/2;//间距位
        while(jmp!=0){
            for (i=jmp;i<data.length;i++){
                tmp=data[i];
                j=i-jmp;
                while(j>=0&&tmp<data[j]){
                    data[j+jmp]=data[j];
                    j=j-jmp;
                }
                data[jmp+j]=tmp;
            }
            jmp=jmp/2;
        }

    }
    /**
     * 打印数组中内容
     * @param data
     */
    public static void printData(int[] data){
        for (int i = 0; i <data.length ; i++) {
            System.out.print(data[i]+"  ");
        }
        System.out.println();
    }
    public static void main(String[] args) {
        int[] data=new int[]{63,92,27,26,45,71,58,7};
        System.out.println("排序前");
        printData(data);
        shell(data);
        System.out.println("排序后");
        printData(data);
    }


归并排序法 

思路分析

合并排序工作原理是针对已排序好的两个或两个以上的数列通过合并的方式,将其合成一个大的且已排好序的数列

步骤如下

(1)将N个长度为1的键值,成对的合并成N/2个长度为2的键值组

(2)将N/2个长度为2的键值组,成对的合并成N/4个长度为4的键值组

(3)将键值组不断的合并,直到合并为一组长度为N的键值组为止

 

代码演示 

public static int[] sortArray(int[] nums) {
        mergeSort(nums,0,nums.length-1);
        return nums;
    }
    public static void mergeSort(int[] arr, int left, int right) {
        if (left < right) {
            int mid = left + ((right - left) >> 1);
            mergeSort(arr,left,mid);
            mergeSort(arr,mid+1,right);
            merge(arr,left,mid,right);
        }
    }
    //归并
    public static void merge(int[] arr,int left, int mid, int right) {
        //第一步,定义一个新的临时数组
        int[] temparr = new int[right -left + 1];
        int temp1 = left, temp2 = mid + 1;
        int index = 0;
        //对应第二步,比较每个指针指向的值,小的存入大集合
        while (temp1 <= mid && temp2 <= right) {
            if (arr[temp1] <= arr[temp2]) {
                temparr[index++] = arr[temp1++];
            } else {
                temparr[index++] = arr[temp2++];
            }
        }
        //对应第三步,将某一小集合的剩余元素存到大集合中
        if (temp1 <= mid) System.arraycopy(arr, temp1, temparr, index, mid - temp1 + 1);
        if (temp2 <= right) System.arraycopy(arr, temp2, temparr, index, right -temp2 + 1);     //将大集合的元素复制回原数组
        System.arraycopy(temparr,0,arr,0+left,right-left+1);
    }
    public static void printData(int[] data){
        for (int i = 0; i <data.length ; i++) {
            System.out.print(data[i]+"  ");
        }
        System.out.println();
    }
    public static void main(String[] args) {
        int[] data=new int[]{36,16,41,72,52,98,63,25};
        System.out.println("排序前");
        printData(data);
        sortArray(data);
        System.out.println("排序后");
        printData(data);
    }


快速排序 

思路分析

 快速排序也称分割交换排序法,是目前公认的最佳的排序法,先会在数据中找到一个虚拟的中间值,并按此中间值将所有打算排序的数据分为两部分,其中小于中间值的放在左边,大于中间值的放在右边,再以同样的方式分别处理左右两边的数据,直到排序完为止,具体操作如下:

1.先假设K的值为第一个中间值

2.从左向右找出中间值K,使得Ki<K

3.从右向左找出中间值K,使得Kj>K

4.如果i<j,那么交换Ki与Kj的值,并且回到步骤2

5.若i>=j,则将K与Kj做交换,并且以j为基点分割成左右部分,然后再 针对左右两边重复步骤1到步骤5,直到左边边值=右半边值为止

步骤如下:

 因为i<j,所以交换两个下标的值

再次重复步骤2 

 因为i<j,所以交换两个下标的值

 继续重复步骤2

 

 

 经过以上的步骤,可以将小于K的数据放在左半部,大于K的数据放在右半部,按照上述排序过程,对左右分为两部分再进行分别排序

 

排序算法的核心就是如何利用基准数将记录分区,这里我们主要介绍一种容易理解的方法,利用双指针思想进行元素交换。 还有一种挖坑填坑的思想,暂不做介绍

代码实现 

class Solution {
    public int[] sortArray (int[] nums) {

        quickSort(nums,0,nums.length-1);
        return nums;

    }

    public void quickSort (int[] nums, int low, int hight) {

        if (low < hight) {
            int index = partition(nums,low,hight);
            quickSort(nums,low,index-1);
            quickSort(nums,index+1,hight);
        }

    }

    public int partition (int[] nums, int low, int hight) {

        int pivot = nums[low];
        int start = low;

        while (low < hight) {
            while (low < hight && nums[hight] >= pivot) hight--;
            while (low < hight && nums[low] <= pivot) low++;
            if (low >= hight) break;
            swap(nums, low, hight);
        }
        //基准值归位
        swap(nums,start,low);
        return low;
    }
    public void swap (int[] nums, int i, int j) {
        int temp = nums[i];
        nums[i] = nums[j];
        nums[j] = temp;
    }
}

public class Main {
    public static void main(String[] args) {
        Solution solution=new Solution();
        int[] elem=new int[]{35,10,42,3,79,12,62,18,51,23};
        System.out.println("排序前");
        System.out.println(Arrays.toString(elem));
        solution.sortArray(elem);
        System.out.println("排序后");
        System.out.println(Arrays.toString(elem));
    }
}


堆积排序法

思路分析

堆积排序是选择排序的改进版,他可以减少选择排序法中的比较次数,进而减少排序时间,堆积排序其实是利用到了二叉树的技巧,它是通过对技术来完成排序的,而要实现这种二叉树,我们还需要利用到最大堆和最小堆,也被称为大堆和小堆

我们来介绍一下大堆和小堆的特征:

大堆:

·他是一个完全二叉树(满二叉树也可)

·所有根节点的值大于等于左右节点的值

·树根的值为堆积树中的 最大值

 

小堆:

·他是一个完全二叉树(满二叉树也可)

·所有根节点的值小于等于左右节点的值

·树根的值为堆积树中的 最小值

 我们对大堆和小堆已经有了一个基本的了解, 我们下面来实现一下堆积排序法思路

首先建立堆积树,我们按照大堆来实现,所以说 我们最后得到的结果会使从大到小的排序

 大堆积树

 将57从树根返回并删除,重现建立堆积树,这边我们要提到一点,如果要删除树根的话,我们的操作是要先将完全二叉树的最后一个节点与树根的值做交换,我们再返回并删除最后一个节点,再将树根的值看做新加入的元素换到左右子树中较小的一端,依次比较直到找到合适的位置或到叶子

 将43从树根删除,重新建立堆积树

  将40从树根删除,重新建立堆积树

   将34从树根删除,重新建立堆积树

 将19从树根删除,重新建立堆积树

 将17从树根删除,重新建立堆积树

  将14从树根删除,重新建立堆积树

  将4从树根删除,我们可以得到的排序是

 

代码实现 

class Solution1 {
    public int[] sortArray(int[] nums) {

        int len = nums.length;
        int[] a = new int[len + 1];

        for (int i = 0; i < nums.length; ++i) {
            a[i+1] = nums[i];
        }
        //下沉建堆
        for (int i = len/2; i >= 1; --i) {
            sink(a,i,len);
        }

        int k = len;
        //排序
        while (k > 1) {
            swap(a,1,k--);
            sink(a,1,k);
        }
        for (int i = 1; i < len+1; ++i) {
            nums[i-1] = a[i];
        }
        return nums;
    }
    public void sink (int[] nums, int k,int end) {
        //下沉
        while (2 * k <= end) {
            int j = 2 * k;
            //找出子节点中最大或最小的那个
            if (j + 1 <= end && nums[j + 1] > nums[j]) {
                j++;
            }
            if (nums[j] > nums[k]) {
                swap(nums, j, k);
            } else {
                break;
            }
            k = j;
        }
    }
    public void swap (int nums[], int i, int j) {
        int temp = nums[i];
        nums[i] = nums[j];
        nums[j] = temp;
    }

}
public class Main2 {
    public static void main(String[] args) {
        Solution solution=new Solution();
        int[] elem=new int[]{34,19,40,14,57,17,4,43};
        System.out.println("排序前");
        System.out.println(Arrays.toString(elem));
        solution.sortArray(elem);
        System.out.println("排序后");
        System.out.println(Arrays.toString(elem));
    }
}

 


基数排序法

思路分析

基数排序法使用的思路非常简单,而且与之前的排序法大不相同,它并不需要元素直接的比较来确定位置,而是属于一种分配模式排序方式,我们直接看图就可以理解它的思路

原始数据如下

将每个整数按其个位数字放到列表中

 

 

将每个整数按照其十位数字放到列表中

 合并后成为:

 将每个整数按照其百位数字放到表中

 合并后成为:

 如此一来我们便完成了排序,是不是很神奇

代码演示 

class Solution3{
    public  void radixSort(int[] data) {
        int maxBin = maxBin(data);
        List<List<Integer>> list = new ArrayList<List<Integer>>();
        for (int i = 0; i < 10; i++) {
            list.add(new ArrayList<Integer>());
        }
        for (int i = 0, factor = 1; i < maxBin; factor *= 10, i++) {
            for (int j = 0; j < data.length; j++) {
                list.get((data[j] / factor) % 10).add(data[j]);
            }
            for (int j = 0, k = 0; j < list.size(); j++) {
                while (!list.get(j).isEmpty()) {
                    data[k] = list.get(j).get(0);
                    list.get(j).remove(0);
                    k++;
                }
            }
        }
    }

    //计算数组里元素的最大位数
    public  int maxBin(int[] data) {
        int maxLen = 0;
        for (int i = 0; i < data.length; i++) {
            int size = Integer.toString(data[i]).length();
            maxLen = size > maxLen ? size : maxLen;
        }
        return maxLen;
    }

}
public class Main3 {
    public static void main(String[] args) {
        Solution3 solution=new Solution3();
        int[] elem=new int[]{59,95,7,34,60,168,171,259,372,45,88,133};
        System.out.println("排序前");
        System.out.println(Arrays.toString(elem));
        solution.radixSort(elem);
        System.out.println("排序后");
        System.out.println(Arrays.toString(elem));
    }


}

 


八大排序稳定性总结

稳定:插入排序,冒泡排序,归并排序,基数排序,希尔排序

不稳定:选择排序,快速排序,堆积排序

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

剑指Offer07.重建二叉树_解题思路代码实现

一、题目描述 输入某二叉树的前序遍历和中序遍历的结果&#xff0c;请构建该二叉树并返回其根节点。 假设输入的前序遍历和中序遍历的结果中都不含重复的数字。 二、示例输入输出 示例1&#xff1a; Input: preorder [3,9,20,15,7], inorder [9,3,15,20,7] Output: [3,9…

LeetCode 1752. 检查数组是否经排序和轮转得到

思路&#xff1a;两段单调性均为递增 最多出现一次前大后小 代码&#xff1a; class Solution { public:bool check(vector<int>& nums) {int res 0;for (int i 0; i < nums.size(); i) if (nums[i] > nums[(i 1) % nums.size()]) res ;return res < 1…

Java中next()和nextLine()的区别(为什么nextLine()输入回车没显示)

一、问题描述&#xff1a; 前几天遇到了一个小问题&#xff1a;为了简化&#xff0c;我手打了一段简单的代码&#xff0c;如下&#xff1a; import java.util.Scanner;public class Test01 {public static void main(String[] args) {Scanner sc new Scanner(System.in);Sys…

kafka使用场景与设计原理

目录 1 kafka的介绍 2 架构 2.1 工作流程 2.2 副本原理 2.3 分区和主题的关系 2.4 生产者 2.4.1 为什么分区-可以水平扩展 2.4.2 分区策略 2.5 消费者 2.5.1 消费方式 2.5.2 分区分配策略 2.6 数据可靠性保证 2.6.1 副本数据同步策略 2.6.2 ACK 应答机制 2.6.3 …

MATPOWER下载安装教程

MATPOWER安装包官网下载链接&#xff1a; https://matpower.org/download/ 一、从官网下载后解压 点开解压后的文件&#xff0c;可以看到MATPOWER的安装包实际为一个程序包&#xff1a; 二、将MATPOWER放在bin目录下 将MATPOWER文件复制在C:\Program Files (x86)\MATLAB\R2…

植树节种树-第12届蓝桥杯Scratch选拔赛真题精选

[导读]&#xff1a;超平老师计划推出Scratch蓝桥杯真题解析100讲&#xff0c;这是超平老师解读Scratch蓝桥真题系列的第87讲。 蓝桥杯选拔赛每一届都要举行4~5次&#xff0c;和省赛、国赛相比&#xff0c;题目要简单不少&#xff0c;再加上篇幅有限&#xff0c;因此我精挑细选…

用DIV+CSS技术设计的红酒主题网站(web前端网页制作课作业)

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

【LeetCode144、145、94. 二叉树遍历】——递归算法、利用栈

144、145、94 二叉树遍历 这三道题分别考察二叉树的前序遍历、后序遍历、中序遍历。 二叉树的遍历问题是二叉树较为基础的一类问题&#xff0c;通常来讲&#xff0c;都是使用递归算法来实现的。而递归算法的关键就在于&#xff0c;确定递归函数的参数以及返回值、终止条件&am…

基于SqlNode的血缘解析

案例分析 基于社区当前最新版本calcite-1.32.0进行分析 当前的SqlValidatorTest$testFieldOrigin中有一个单测可以直接用来调试 调试后&#xff0c;很快就能在测试专用方法assertFieldOrigin找到SqlValidatorTest$getFieldOrigins这个血缘入口方法 public SqlValidatorFixtu…

AWR1843+DCA1000+mmwave_studio 采集原始数据

项目场景&#xff1a; AWR1843、DCA1000板与mmwave_studio的结合使用 实现数据采集工作 首先就是准备好各种相关的软件unfinish、matlabRuntime、mmwave_studio 没有涉及到css等 只是简单的数据采集工作。 问题1描述 在烧写完开箱demo后&#xff0c;开启mmwave_studio 出现找…

使用jmh框架进行benchmark测试

性能问题 最近在跑flink社区1.15版本使用json_value函数时&#xff0c;发现其性能很差&#xff0c;通过jstack查看堆栈经常在执行以下堆栈 可以看到这里的逻辑是在等锁&#xff0c;查看jsonpath的LRUCache //// Source code recreated from a .class file by IntelliJ IDEA// …

pytorch深度学习实战lesson30

第三十课 更多的芯片 虽然 GPU 现在是目前模型训练的主流芯片然后大家很多时候在做预测的时候也在 C PU 上做预测&#xff0c;但实际上来说这个在慢慢的发生改变。今天看一下目前的一些这样子的芯片。 上图是个手机芯片&#xff0c;可以看到有很多计算单元&#xff0c;比如CPU、…

【数字信号去噪】粒子滤波器与FBS、MAP平滑方法数字信号去噪【含Matlab源码 2179期】

⛄一、平滑分解简介 根据奈奎斯特定理,采样频率必须大于等于有用信号最高频率的2倍。假设对心电信号的采样满足奈奎斯特采样定理,则实测信号采样频率的1/2为有用心电信号的最高频率。通过三点平滑滤波,可以将频率大于1/2采样频率的信号滤除,将滤除的信号定义为第1阶平滑分解分…

使用 IDEA 的 Dedis 插件连接 Redis 服务器

IDEA 中的 Redis 插件作为 Redis 的可视化工具&#xff0c;可以通过此插件连接 Redis 服务器&#xff0c;并且进行增删改查操作 【一】 IDEA 安装 Redis 插件 1. 点击 File >> Setting 2. 点击 Plugings 3. 点击 Marketplace 一栏的搜索框中输入 redis 4. 点击第一个 R…

yocto machine class解析-st-partitions-image

yocto machine class解析 stm32mp157 yocto的meta-st-stm32mp layer中提供了几个class,后续几篇文章重点分析这些class文件&#xff1a; 第一篇就从st-partitions-image.bbclass 开始&#xff0c;st所有创建image的bb文件都会引用st-partitions-image&#xff0c;包括bootfs u…

审计日志功能实现优化及测试记录(参照若依系统,以dolphinscheduler 2.0.5 为例,实现相关功能)

目录&#x1f42c;使用&#x1f420;若依-操作日志&#x1f420;引入海豚调度&#x1f41f;引入审计日志包&#xff0c;增加LogAnnotation注解&#x1f42c;问题记录及优化&#x1f420;service方法注解时而生效&#xff0c;时而不生效&#x1f41f;不生效原因&#x1f41f;修改…

基于springboot+mybatis+sqlserver+jsp运行会报名管理系统

基于springbootmybatissqlserverjsp运行会报名管理系统一、系统介绍二、功能展示1.用户登陆2.用户注册3.项目列表(运行员)4.报名列表&#xff08;运动员&#xff09;5.运动员项目列表&#xff08;管理员&#xff09;6.添加项目四、获取源码一、系统介绍 系统主要功能&#xff…

【计算机组成原理Note】2.4.2 加法器

文章目录加法器1. 一位全加器2. 串行加法器3. 串行进位加法器加法器4. 先行进位加法器加法器 1. 一位全加器 一位全加器&#xff0c;当前位输出&#xff1a;SiAi⨁Bi⨁Ci也就是输入中有奇数个1时输出为1&#xff08;异或&#xff09;向高位的进位&#xff1a;CiAiBi(Ai⨁Bi)Ci…

【目标检测】LLA: Loss-aware label assignment for dense pedestrian detection【标签分配】

总结 本文提出了一种用于行人目标检测的标签分配策略&#xff0c;具体来说&#xff0c;主要有以下几步流程。 构建代价矩阵。通过网络的前向传播得到网络的输出&#xff0c;CclsC^{cls}Ccls, CregC^{reg}Creg&#xff0c;构建代价矩阵CCclsλ∗CregCC^{cls}\lambda*C^{reg}CC…

小程序环境切换自定义组件

背景&#xff1a; 最近一直有参与小程序的项目&#xff0c;发现切换环境时经常要上传然后再设置为体验版&#xff0c;比较麻烦&#xff0c;所以尝试做了个切换环境的组件&#xff0c;分享给大家&#xff0c;希望大家能用得上&#xff0c;提点建议 组件长这个样子 展开后 功能&a…