Java_排序

news2024/12/27 10:18:16

文章目录

  • 一、排序的概念
  • 二、常见的排序算法
  • 三、常见排序算法的实现
    • 1.插入排序
      • 1、基本思想
      • 2、直接插入排序
      • 3、希尔排序(缩小增量排序)
    • 2.选择排序
      • 1、基本思想
      • 2、直接选择排序
      • 2、堆排序
    • 3.交换排序
      • 1、冒泡排序
      • 2、快速排序
      • 3、快速排序优化
      • 4、快速排序非递归
    • 4.归并排序
      • 1、基本思想
      • 2、海量数据的排序问题
  • 四、排序算法复杂度及稳定性分析
  • 五、练习


一、排序的概念

排序:所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。
稳定性:假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序后的序列中,r[i]仍在r[j]之前,则称这种排序算法是稳定的;否则称为不稳定的。
在这里插入图片描述
内部排序:数据元素全部放在内存中的排序。
外部排序:数据元素太多不能同时放在内存中,根据排序过程的要求不能在内外存之间移动数据的排序。

二、常见的排序算法

在这里插入图片描述

三、常见排序算法的实现

1.插入排序

1、基本思想

直接插入排序是一种简单的插入排序法,其基本思想是:
把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为止,得到一个新的有序序列 。

2、直接插入排序

当插入第i(i>=1)个元素时,前面的array[0],array[1],…,array[i-1]已经排好序,此时用array[i]的排序码与array[i-1],array[i-2],…的排序码顺序进行比较,找到插入位置即将array[i]插入,原来位置上的元素顺序后移
在这里插入图片描述
时间复杂度:
最坏情况下:O(n^2)
最好情况下:O(n) 当数据越有序,排序越快
适用于:待排序序列 已经基本上趋于有序了
空间复杂度:
O(1)
稳定性:
稳定

逻辑:
假设这组数据的第一个元素是有序的,从第二个元素开始,依次和前面的元素进行比较找到合适的位置就进行插入。

代码实现:

    public static void insertSort(int[] array)
    {
        if(array==null||array.length<=1)
        {
            return;
        }
        for(int end = 1;end<array.length;end++)
        {
            int temp  = array[end];
            int cur = end-1;
            while(cur>=0)
            {
                if(array[cur]>temp)
                {
                    array[cur+1] =array[cur];
                    cur--;
                }
                else
                {
                    break;
                }
            }
            array[cur+1] = temp;

        }
    }

测试代码:

    public static void main(String[] args) {
        int [] array ={27,15,9,18,28};
        insertSort(array);
        System.out.println(Arrays.toString(array));
    }

在这里插入图片描述

3、希尔排序(缩小增量排序)

希尔排序法又称缩小增量法。希尔排序法的基本思想是:
先选定一个整数,把待排序文件中所有记录分成多个组,所有距离为的记录分在同一组内,并对每一组内的记录进行排序。然后,取,重复上述分组和排序的工作。当到达=1时,所有记录在统一组内排好序。
在这里插入图片描述
gap = 5 和 gap = 3是预排序,每组插入排序的优点是越有序越快,当gap = 5时,每组数据少,当gap = 3越来越有序了,直到gap =1时,虽然数据量大了,但也有序了。

希尔排序的特性总结:

  1. 希尔排序是对直接插入排序的优化。
  2. 当gap > 1时都是预排序,目的是让数组更接近于有序。当gap == 1时,数组已经接近有序的了,这样就会很快。这样整体而言,可以达到优化的效果。我们实现后可以进行性能测试的对比。
  3. 希尔排序的时间复杂度不好计算,因为gap的取值方法很多,导致很难去计算,暂时按照O(n1.25)到O(1.6*n1.25)
  4. 稳定性:不稳定

代码实现:

    public static void shellSort(int [] array)
    {
        int gap = array.length;
        while(gap>1)
        {
            gap /=2;
            shell(array,gap);
        }
    }

    public static void shell(int [] array,int gap)
    {
        for(int end = gap;end<array.length;end++)
        {
            int temp  = array[end];
            int cur = end-gap;
            while(cur>=0)
            {
                if(array[cur]>temp)
                {
                    array[cur+gap] = array[cur];
                    cur-=gap;
                }
                else
                {
                    break;
                }
            }
            array[cur+gap] = temp;
        }
    }

测试代码:

    public static void main(String[] args) {
        int [] array ={27,15,9,18,28,-100};
//        insertSort(array);
        shellSort(array);
        System.out.println(Arrays.toString(array));
    }

在这里插入图片描述

2.选择排序

1、基本思想

每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完 。

2、直接选择排序

在元素集合array[i]–array[n-1]中选择关键码最大(小)的数据元素
若它不是这组元素中的最后一个(第一个)元素,则将它与这组元素中的最后一个(第一个)元素交换
在剩余的array[i]–array[n-2](array[i+1]–array[n-1])集合中,重复上述步骤,直到集合剩余1个元素

直接选择排序的特性总结:

  1. 直接选择排序思考非常好理解,但是效率不是很好。实际中很少使用
  2. 时间复杂度:O(N^2)
  3. 空间复杂度:O(1)
  4. 稳定性:不稳定
    代码实现:
    public  static void selectSort(int []array)
    {
        int len = array.length;
        for(int end = len-1;end>0;end--)
        {
            int maxIndex = 0;
            for(int cur = 0;cur<=end;cur++)
            {
                if(array[maxIndex]<array[cur])
                {
                    maxIndex = cur;
                }
            }
            int temp = array[end];
            array[end] = array[maxIndex];
            array[maxIndex] =temp;
        }
    }

优化:
可以在一次遍历时,记录最小值的引索和最大值的引索,这是双向选择。

代码实现:

    public  static void selectSort2(int []array)
    {
        int len = array.length;
        for(int begin = 0,end = len-1;begin<end;begin++,end--)
        {
            int maxIndex = begin;
            int minIndex = begin;
            int cur = begin;
            while(cur<=end)
            {
                if(array[maxIndex]<array[cur])
                {
                    maxIndex = cur;
                }
                if(array[minIndex]>array[cur])
                {
                    minIndex = cur;
                }
                cur++;
            }
            if(maxIndex == begin)
            {
                maxIndex = minIndex;
            }
            swap(array,begin,minIndex);
            swap(array,end,maxIndex);
        }
    }

    public static void swap(int [] array,int i,int j)
    {
        int temp = array[i];
        array[i] = array[j];
        array[j]  =temp;
    }

注意:
最后交换位置的时候,最小位置和最小引索交换,可能会导致最大值被换到其他位置,所以要在交换前检查 maxIndex和begin是否一样。

2、堆排序

堆排序(Heapsort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法,它是选择排序的一种。它是通过堆来进行选择数据。需要注意的是排升序要建大堆,排降序建小堆。 
在这里插入图片描述
堆排序的特性总结:

  1. 堆排序使用堆来选数,效率就高了很多。
  2. 时间复杂度:O(N*logN)
  3. 空间复杂度:O(1)
  4. 稳定性:不稳定
    代码实现:
    public static void createHeap(int [] array)
    {
        int len  = array.length;
        for(int cur =(len-1-1)/2;cur>=0;cur--)
        {
            siftDown(array,cur,len);
        }
    }

    public static void heapSort(int [] array)
    {
        createHeap(array);
        for(int end = array.length-1;end>0;end--)
        {
            swap(array,0,end);
            siftDown(array,0,end);
        }

    }

    public static void siftDown(int [] array,int parent,int useSize)
    {
        int child = parent*2+1;
        while(child<useSize)
        {
            if(child+1<useSize&&array[child+1]>array[child])
            {
                child = child+1;
            }
            if(array[parent]<array[child])
            {
                swap(array,parent,child);
                parent = child;
                child = parent*2+1;
            }
            else
            {
                break;
            }
        }
    }

测试代码:

    public static void main(String[] args) {
        int [] array ={ 100,27,15,9,18,28,-100,20};
//        insertSort(array);
//        shellSort(array);
//        selectSort(array);
//        selectSort2(array);
        heapSort(array);
        System.out.println(Arrays.toString(array));
    }

在这里插入图片描述

3.交换排序

基本思想:所谓交换,就是根据序列中两个记录键值的比较结果来对换这两个记录在序列中的位置,交换排序的特点是:将键值较大的记录向序列的尾部移动,键值较小的记录向序列的前部移动

1、冒泡排序

冒泡排序(Bubble Sort)也是一种简单直观的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢"浮"到数列的顶端。
请添加图片描述

冒泡排序的特性总结:

  1. 冒泡排序是一种非常容易理解的排序
  2. 时间复杂度:O(N^2)
  3. 空间复杂度:O(1)
  4. 稳定性:稳定

冒泡排序还有一种优化算法,就是立一个 flag,当在一趟序列遍历中元素没有发生交换,则证明该序列已经有序。

代码实现:

    public static void bubbleSort(int[] array)
    {
        for(int i = 0;i<array.length-1;i++)
        {
            boolean flag = true;
            for(int j = 1;j<array.length-i;j++)
            {
                if(array[j]<array[j-1])
                {
                    swap(array,j,j-1);
                    flag  = false;
                }
            }
            if(flag)
            {
                break;
            }
        }
    }

测试代码:

    public static void main(String[] args) {
        int [] array ={ 100,27,15,9,18,28,-100,20};
        int [] array2 = {1,2,3,4,5};
//        insertSort(array);
//        shellSort(array);
//        selectSort(array);
//        selectSort2(array);
//        heapSort(array);
        bubbleSort(array);
        bubbleSort(array2);
        System.out.println(Arrays.toString(array));
        System.out.println(Arrays.toString(array2));
    }

在这里插入图片描述

2、快速排序

快速排序是Hoare于1962年提出的一种二叉树结构的交换排序方法,其基本思想为:任取待排序元素序列中的某元素作为基准值,按照该排序码将待排序集合分割成两子序列,左子序列中所有元素均小于基准值,右子序列中所有元素均大于基准值,然后最左右子序列重复该过程,直到所有元素都排列在相应位置上为止。

快速排序总结:

  1. 快速排序整体的综合性能和使用场景都是比较好的,所以才敢叫快速排序
  2. 时间复杂度:O(N*logN)
  3. 空间复杂度:O(logN)
  4. 稳定性:不稳定

代码实现Hoare版本:

     public static void quickSort(int [] array)
     {
         quick(array,0,array.length-1);
     }

     public static void quick(int[]array,int start,int end )
     {
         if(start>=end)
         {
             return;
         }

         int pivot = partitionHoare(array,start,end);
         quick(array,start,pivot-1);
         quick(array,pivot+1,end);

     }

    private static int partitionHoare(int[] array, int left, int right) {
        int temp = array[left];
        int i = left;

        while(left<right)
        {
            //找小于temp
            while(left<right && array[right]>=temp)
            {
                right--;
            }
            //找大于temp
             while(left<right && array[left]<=temp)
             {
                 left++;
             }

             swap(array,left,right);
        }
        swap(array,i,left);
        return left;
    }

代码实现挖坑法:

     public static void quickSort(int [] array)
     {
         quick(array,0,array.length-1);
     }

     public static void quick(int[]array,int start,int end )
     {
         if(start>=end)
         {
             return;
         }

         int pivot = partitionHole(array,start,end);
         quick(array,start,pivot-1);
         quick(array,pivot+1,end);

     }
    private static int partitionHole(int[] array, int left, int right) {
        int temp = array[left];
        while(left<right)
        {
            if(left<right&&array[right]>=temp)
            {
                right--;
            }
            array[left] = array[right];//现在坑变成right
            if(left<right&&array[left]<=temp)
            {
                left++;
            }
            array[right] =array[left];
        }
        array[left] =temp;
        return left;
    }

思考:

  1. 为什么array[right]>=temp 和array[left]<=temp要取=?
    会造成死循环

  2. 为什么先从右边而不是先从左边?
    对于Hoare法,如果先走左边有可能出现相遇的是大的数据,最后把大的数据放到了最前面。

代码实现前后指针:

     public static void quickSort(int [] array)
     {
         quick(array,0,array.length-1);
     }

     public static void quick(int[]array,int start,int end )
     {
         if(start>=end)
         {
             return;
         }

         int pivot = partitionD(array,start,end);
         quick(array,start,pivot-1);
         quick(array,pivot+1,end);

     }
    private static int partitionD(int[] array, int left, int right) {
        int temp = array[left];
        int prev = left;
        int cur = left+1;
        //[left,prev]是<=temp
        //[prev+1,cur)是>temp
        //[cur,right]是待排
        while(cur<=right)
        {
            if(array[cur]>temp)
            {
                cur++;
            }
            else
            {
                swap(array,++prev,cur++);
            }
        }
        swap(array,left,prev);
        return  prev;
    }

3、快速排序优化

出发点:减少递归次数

  1. 三数取中法选key
  2. 递归到小的子区间时,可以考虑使用插入排序

优化后的代码:

 public static void insertSort(int[] array,int left,int right)
    {
        if(array==null||array.length<=1)
        {
            return;
        }
        for(int end = left+1;end<=right;end++)
        {
            int temp  = array[end];
            int cur = end-1;
            while(cur>=0)
            {
                if(array[cur]>temp)
                {
                    array[cur+1] =array[cur];
                    cur--;
                }
                else
                {
                    break;
                }
            }
            array[cur+1] = temp;

        }
    }
     public static void quickSort(int [] array)
     {
         quick(array,0,array.length-1);
     }

     public static void quick(int[]array,int start,int end )
     {
         if(end-start+1<3)
         {
             insertSort(array,start,end);
             return;
         }
         int mid = middleNum(array,start,end);
         swap(array,mid,start);
         int pivot = partitionD(array,start,end);
         quick(array,start,pivot-1);
         quick(array,pivot+1,end);

     }

     public  static int middleNum(int [] array,int left,int right)
     {
         int mid  = (left+right)/2;
         if(array[left]<array[right])
         {
             if(array[mid]<array[left])
             {
                 return left;
             }
             else if(array[mid]>array[right])
             {
                 return right;
             }
             else
             {
                 return mid;
             }
         }
         else
         {
             //left>right
             if(array[mid]>array[left])
             {
                 return left;
             }
             else  if(array[mid]<array[right])
             {
                 return right;
             }
             else
             {
                 return mid;
             }
         }
     }
    private static int partitionD(int[] array, int left, int right) {

        int temp = array[left];
        int prev = left;
        int cur = left+1;
        //[left,prev]是<=temp
        //[prev+1,cur)是>temp
        //[cur,right]是待排
        while(cur<=right)
        {
            if(array[cur]>temp)
            {
                cur++;
            }
            else
            {
                swap(array,++prev,cur++);
            }
        }
        swap(array,left,prev);
        return  prev;
    }

4、快速排序非递归

把划分两个区间的左右边界存到栈里,不断拿出区间快排,划分两个区间,存入栈里,直到栈为空时,即表示数组排完。

快速排序总结

  1. 快速排序整体的综合性能和使用场景都是比较好的,所以才敢叫快速排序
  2. 时间复杂度:O(N*logN)
  3. 空间复杂度:O(logN)
  4. 稳定性:不稳定
    代码实现:
    public static void quickSortNonR(int[] array, int left, int right) {
        Stack<Integer> stack = new Stack<>();
        stack.push(left);
        stack.push(right);
        while(!stack.isEmpty())
        {
            int end = stack.pop();
            int begin = stack.pop();
            if(begin>=end)
            {
                continue;
            }
            int mid = middleNum(array,begin,end);
            swap(array,begin,mid);
            int key = array[begin];
            int prev = begin;
            int cur = prev+1;
            //[begin,prev] 是<=key
            //[prev,cur)是>key
            //[cur,end]是待排序列
            while(cur<=end)
            {
                if(array[cur]<key)
                {
                    swap(array,++prev,cur++);
                }
                else
                {
                    cur++;
                }
            }
            swap(array,begin,prev);

            if(prev-1>begin)
            {
                stack.push(begin);
                stack.push(prev-1);
            }
            if(prev+1<end)
            {
                stack.push(prev+1);
                stack.push(end);
            }
        }
    }


    public static void swap(int [] array,int i,int j)
    {
        int temp = array[i];
        array[i] = array[j];
        array[j]  =temp;
    }

    public  static int middleNum(int [] array,int left,int right)
    {
        int mid  = (left+right)/2;
        if(array[left]<array[right])
        {
            if(array[mid]<array[left])
            {
                return left;
            }
            else if(array[mid]>array[right])
            {
                return right;
            }
            else
            {
                return mid;
            }
        }
        else
        {
            //left>right
            if(array[mid]>array[left])
            {
                return left;
            }
            else  if(array[mid]<array[right])
            {
                return right;
            }
            else
            {
                return mid;
            }
        }
    }

测试代码:

    public static void main(String[] args) {
        int [] array ={ 100,27,15,9,18,28,-100,20};
        quickSortNonR(array,0,array.length-1);
        System.out.println(Arrays.toString(array));
    }

在这里插入图片描述

4.归并排序

1、基本思想

归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide andConquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。 归并排序核心步骤:
在这里插入图片描述
归并排序总结

  1. 归并的缺点在于需要O(N)的空间复杂度,归并排序的思考更多的是解决在磁盘中的外排序问题。
  2. 时间复杂度:O(N*logN)
  3. 空间复杂度:O(N)
  4. 稳定性:稳定
    递归代码实现:
  public static void mergeSort(int []array)
    {
        mergeSortFun(array,0,array.length-1);
    }

    public static void mergeSortFun(int[] array, int left, int right) {
        if(left>=right)
        {
            return;
        }
        int mid = (left+right)/2;
        mergeSortFun(array,left,mid);
        mergeSortFun(array,mid+1,right);

        merge(array,left,mid,right);
    }

    public static void merge(int[] array,int left,int mid ,int right)
    {
        int capacity = right-left+1;
        int [] temp = new int [capacity];
        int begin1 = left;
        int begin2 = mid+1;
        int k = 0;
        while(begin1<=mid&&begin2<=right)
        {
            if(array[begin1]<=array[begin2])
            {
                temp[k++] = array[begin1++];
            }
            else
            {
                temp[k++] =array[begin2++];
            }
        }



        while(begin1<=mid)
        {
            temp[k++] = array[begin1++];
        }
        while(begin2<=right)
        {
            temp[k++] = array[begin2++];
        }
        for(int i = 0;i<k;i++)
        {
            array[i+left] = temp[i];
        }

    }

归并排序非递归代码实现:

    public static void mergeSortNor(int [] array)
    {
        int gap = 1;
        while(gap<array.length)
        {
            for(int i = 0;i<array.length;i+=2*gap)
            {
                int left = i;
//                int mid = left+gap-1;
//                int right = mid+gap;
                int mid = Math.min(left+gap-1,array.length-1);
                int right = Math.min(mid + gap, array.length - 1);
                int [] temp  = new int [2*gap];

                int k = 0;
                int begin1 = left;
                int begin2 = mid+1;
                while(begin1<=mid&&begin2<=right)
                {
                    if(array[begin1]<array[begin2])
                    {
                        temp[k++] =  array[begin1++];
                    }
                    else {
                        temp[k++] =array[begin2++];
                    }
                }

                while (begin1<=mid)
                {
                    temp[k++]=array[begin1++];
                }
                while (begin2<=right)
                {
                    temp[k++] = array[begin2++];
                }

                for(int j = 0;j<k;j++)
                {
                    array[left+j] = temp[j];
                }
            }
            gap*=2;
        }
    }

2、海量数据的排序问题

外部排序:排序过程需要在磁盘等外部存储进行的排序
前提:内存只有 1G,需要排序的数据有 100G
因为内存中因为无法把所有数据全部放下,所以需要外部排序,而归并排序是最常用的外部排序

  1. 先把文件切分成 200 份,每个 512 M
  2. 分别对 512 M 排序,因为内存已经可以放的下,所以任意排序方式都可以
  3. 进行 2路归并,同时对 200 份有序文件做归并过程,最终结果就有序了

四、排序算法复杂度及稳定性分析

在这里插入图片描述

O(n^2) O(n^2) O(1) 稳定
选择排序 O(n^2) O(n^2) O(n^2) O(1) 不稳定
希尔排序 O(n) O(n^1.3) O(n^2) O(1) 不稳定
堆排序 O(n * log(n)) O(n * log(n)) O(n * log(n)) O(1) 不稳定
快速排序 O(n * log(n)) O(n * log(n)) O(n^2) O(log(n)) ~ O(n) 不稳定
归并排序 O(n * log(n)) O(n * log(n)) O(n * log(n)) O(n) 稳定

排序方法最好平均最坏空间复杂度稳定性
冒泡排序O(n)O(n^2)O(n^2)O(1)稳定
插入排序O(n)O(n^2)O(n^2)O(1)稳定
选择排序O(n^2)O(n^2)O(n^2)O(1)不稳定
希尔排序O(n)O(n^1.3)O(n^2)O(1)不稳定
堆排序O(n*logn)O(n*logn)O(n*logn)O(1)不稳定
快速排序O(n*logn)O(n*logn)O(n^2)O(long(n))~O(n)不稳定
归并排序O(n*logn)O(n*logn)O(n*logn)O(n)稳定

五、练习

题目:

1. 快速排序算法是基于()的一个排序算法。
A:分治法 B:贪心法 C:递归法 D:动态规划法
2.对记录(54,38,96,23,15,72,60,45,83)进行从小到大的直接插入排序时,当把第8个记录45插入到有序表时,为找到插入
位置需比较()次?(采用从后往前比较)
A: 3 B: 4 C: 5 D: 6
3.以下排序方式中占用O(n)辅助存储空间的是()
A: 简单排序 B: 快速排序 C: 堆排序 D: 归并排序
4.下列排序算法中稳定且时间复杂度为O(n^2)的是()
A: 快速排序 B: 冒泡排序 C: 直接选择排序 D: 归并排序
5.关于排序,下面说法不正确的是()
A: 快排时间复杂度为O(N*logN),空间复杂度为O(logN)
B: 归并排序是一种稳定的排序,堆排序和快排均不稳定
C: 序列基本有序时,快排退化成 "冒泡排序",直接插入排序最快
D: 归并排序空间复杂度为O(N), 堆排序空间复杂度的为O(logN)
6.设一组初始记录关键字序列为(65,56,72,99,86,25,34,66),则以第一个关键字65为基准而得到的一趟快速排序结果是()
A: 3456256586997266 B: 2534566599867266
C: 3456256566998672 D: 3456256599867266

答案:

1.A 2.C 3.D 4.B 5.D 6.A

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

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

相关文章

day2:keil5基础2

思维导图 使用ADC采样光敏电阻数值&#xff0c;如何根据这个数值调节LED灯亮度。2.总结DMA空闲中断接收数据的使用方法 while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */adc_value HAL_ADC_GetValue(&hadc);TIM3->CCR3 adc_value * 999 / 4095;printf(&q…

Stable Diffusion 模型分享:DucHaiten-AIart-SDXL(动漫、3D、逼真)

本文收录于《AI绘画从入门到精通》专栏&#xff0c;专栏总目录&#xff1a;点这里。 文章目录 模型介绍生成案例案例一案例二案例三案例四案例五案例六案例七案例八 下载地址 模型介绍 这是一个丰富多彩的 SDXL 模型&#xff0c;可以绘制动漫、3D、科幻、真实等类型的图片。 …

第 5 章 ROS常用组件动态坐标变换(自学二刷笔记)

5.1.3 动态坐标变换 所谓动态坐标变换&#xff0c;是指两个坐标系之间的相对位置是变化的。 需求描述: 启动 turtlesim_node&#xff0c;该节点中窗体有一个世界坐标系(左下角为坐标系原点)&#xff0c;乌龟是另一个坐标系&#xff0c;键盘控制乌龟运动&#xff0c;将两个坐…

请说明Vue中的异步组件加载

Vue中的异步组件加载是指当页面需要渲染某个组件时&#xff0c;可以在需要时再去加载这个组件&#xff0c;而不是在页面初始化的时候就将所有组件一次性加载进来。这种方式能够有效降低页面的初始加载时间&#xff0c;提升用户体验。 在Vue中&#xff0c;我们可以使用import函…

idea Gradle 控制台中文乱码

如下图所示&#xff0c;idea 中的 Gradle 控制台中文乱码&#xff1a; 解决方法&#xff0c;如下图所示&#xff1a; 注意&#xff1a;如果你的 idea 使用 crack 等方式破解了&#xff0c;那么你可能需要在文件 crack-2023\jetbra\vmoptions\idea.vmoptions 中进行配置&#xf…

每日五道java面试题之springMVC篇(一)

目录&#xff1a; 第一题. 什么是Spring MVC&#xff1f;简单介绍下你对Spring MVC的理解&#xff1f;第二题. Spring MVC的优点第三题. Spring MVC的主要组件&#xff1f;第四题. 什么是DispatcherServlet?第五题. 什么是Spring MVC框架的控制器&#xff1f; 第一题. 什么是S…

基于51单片机的车辆出入光电传感管理系统设计

目 录 摘 要 I Abstract II 引 言 1 第1章 系统总体方案设计 3 1.1 整体方案设计 3 1.1.1 控制系统的选择 3 1.1.2 系统框图 4 1.2 最小系统模块 4 1.2.1 STC89C51简介 4 1.2.2 最小系统电路 6 第2章 系统硬件设计 8 2.1 单片机的选择 8 2.2 显示方案的选择 8 2.3 红外检测模块…

VisionPro 判断圆是不是无限接近圆或存在缺陷

项目上可能需要判断圆是否是无限接近圆或者判断圆边缘是否存在缺陷等。 第一种方法&#xff1a;找圆工具和点到点的距离计算圆边缘上的点到圆心距离的最大值和最小值的差值。 #region namespace imports using System; using System.Collections; using System.Drawing; usin…

【论文精读】大语言模型融合知识图谱的问答系统研究

&#x1f497;&#x1f497;&#x1f497;欢迎来到我的博客&#xff0c;你将找到有关如何使用技术解决问题的文章&#xff0c;也会找到某个技术的学习路线。无论你是何种职业&#xff0c;我都希望我的博客对你有所帮助。最后不要忘记订阅我的博客以获取最新文章&#xff0c;也欢…

安装sqlserver2022最新版只能使用.\SQLEXPRESS登录数据库怎么修改成.

.\SQLEXPRESS “服务器名称 localhost\SQLEXPRESS”中的 “SQLEXPRESS”就是数据库的实例名称/数据库名/服务器名&#xff0c; “localhost”即登录本计算机安装的数据库 安装sqlserver2022最新版只能使用.\SQLEXPRESS登录数据库怎么修改成. 2、查看SQL Server数据库的实例名…

Myqsort:基于冒泡排序算法的C语言实现

我们将详细介绍一个基于冒泡排序算法的自定义排序函数——Mysqrt。该函数通过使用用户提供的比较函数进行元素间的比较&#xff0c;并结合swap交换函数对任意类型的数据进行排序。下面是对代码的逐行解析。 逻辑导图 代码实现 // 头文件 #include<stdio.h>// 定义比较函…

RK3568平台 USB数据包的收发格式

一.USB硬件拓扑结构 compound device &#xff1a;多个设备组合起来&#xff0c;通过HUB跟Host相连composite device &#xff1a;一个物理设备有多个逻辑设备(multiple interfaces) 在软件开发过程中&#xff0c;我们可以忽略Hub的存在&#xff0c;硬件拓扑图简化如下&#x…

事务失效的八种情况!!!!

一、非publi修饰的方法。 /*** 私有方法上的注解&#xff0c;不生效&#xff08;因私有方法Spring扫描不到该方法&#xff0c;所以无法生成代理&#xff09;*/ Transactional private boolean test() {//test code }二、类内部访问。 类内部非直接访问带注解标记的方法 B&…

php:下拉列表查询(静态数据+数据库数据)

一、在php中嵌套 效果 1、从php中嵌套html语句 下拉列表的显示 echo <div class"text-nav-1 required "><div> . _(在职状态) . :</div> <select name"work_status">; // 定义选项数组 $options [all > _(全部),inwork &g…

新型设备巡检方案-手机云巡检

随着科技的不断发展&#xff0c;设备巡检工作也在逐步向智能化、高效化方向转变。传统的巡检方式往往需要人工逐个设备检查&#xff0c;耗时耗力&#xff0c;效率低下&#xff0c;同时还容易漏检和误检。而新型设备巡检应用—手机蓝牙云巡检的出现&#xff0c;则为设备巡检工作…

基于springboot+vue的高校教师电子名片系统

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

2024年腾讯云学生服务器活动详细说明、学生机购买流程

2024年腾讯云学生服务器优惠活动「云校园」&#xff0c;学生服务器优惠价格&#xff1a;轻量应用服务器2核2G学生价30元3个月、58元6个月、112元一年&#xff0c;轻量应用服务器4核8G配置191.1元3个月、352.8元6个月、646.8元一年&#xff0c;CVM云服务器2核4G配置842.4元一年&…

2024年最佳硬盘!为台式电脑、NAS等产品量身定做的顶级机械硬盘

机械硬盘&#xff08;HDD&#xff09;可能看起来像是古老的技术&#xff0c;但它们仍然在许多地方提供“足够好”的性能&#xff0c;并且它们很容易以同等的价格提供最多的存储空间。 尽管最好的SSD将为你的操作系统和引导驱动器提供最好的体验&#xff0c;并提供比HDD更好的应…

分布式商业生态战略是数字化时代企业低成本、高效率最新发展方案

企业存在的本质是解决市场难以解决的或即使可以解决也需要耗费大量人力、物力的问题&#xff0c;并以其特有的资源能力降低交易费用&#xff0c;实现盈利。从交易费用角度来说&#xff0c;交易费用决定了企业的存在&#xff0c;企业采取不同的组织方式主要是为了对资源采取不同…

分布式搜索引擎-elasticsearch基础

分布式搜索引擎-elasticsearch基础 1、什么是elasticsearch&#xff1f; elasticsearch是一款非常强大的开源搜索引擎&#xff0c;可以帮助我们从海量数据中快速找到需要的内容。 elasticsearch结合kibana、Logstash、Beats&#xff0c;也就是elastic stack&#xff08;ELK&a…