常见排序算法详解

news2024/11/17 21:33:55

文章目录

  • 前言
    • 1. 排序算法简介
    • 2 算法效率
      • 2.1 度量一个程序执行时间两种方法
      • 2.2 时间频度
      • 2.3 时间复杂度
      • 2.4 常见的时间复杂度
      • 2.5 平均和最坏时间复杂度
    • 3. 常见排序算法详解
      • 3.1 基数排序 (Radix Sort)
        • (1) 算法过程
        • (2)代码实现
      • 3.2 冒泡排序 (Bubble Sort)
        • (1) 算法过程
        • (2) 代码实现
      • 3.3 快速排序 (Quick Sort)
        • (1) 算法过程
        • (2) 代码实现
      • 3.4 插入排序 (Insertion Sort)
        • (1) 算法过程
        • (2) 代码实现
      • 3.5 选择排序 (Selection Sort)
        • (1) 算法过程
        • (2) 代码实现
      • 3.6 希尔排序 (Shell Sort)
        • (1) 算法过程
        • (2) 代码实现
      • 3.7 归并排序 (Merge Sort)
        • (1) 算法过程
        • (2) 代码实现
      • 4. 结语

前言

排序是我们在日常生活和工作中常见的一种操作。在计算机科学中,排序算法就是将一串或一组数据按照特定的顺序进行排列的算法。这些顺序可能是数字的升序或降序,也可能是字母或字词的字母顺序等。我们将探讨几种不同的排序算法,包括他们的原理、优缺点以及代码实现。

1. 排序算法简介

常见的排序算法包括:冒泡排序、快速排序、插入排序、选择排序、希尔排序、归并排序、堆排序、基数排序等。这些排序算法中,有些是比较排序,即通过比较元素之间的关系进行排序;有些是非比较排序,即不通过比较元素之间的关系进行排序,而是通过其他方法,如计数或者映射到其他空间等。

排序算法的效率通常由平均情况时间复杂度、最差情况时间复杂度、空间复杂度、稳定性等多个因素来衡量。不同的排序算法有不同的优点和缺点,适用于不同的应用场景。例如,一些排序算法适用于大数据集,而另一些则更适用于小数据集或几乎已经排好序的数据集。

此博客将详细介绍这些常见的排序算法,包括它们的工作原理,以及适用的场景等。希望通过这个博客,读者可以对这些排序算法有一个全面的理解。

在这里插入图片描述

2 算法效率

度量一个程序执行时间的两种主要方法是事后统计方法和事前估算方法。事后统计方法是直接运行程序,观察实际运行时间。这种方法可行,但存在两个问题:首先,为了评测算法性能,我们需要实际运行程序,这在许多情况下是不现实的;其次,实际运行时间会受到许多因素的影响,包括硬件性能、操作系统、输入数据的大小和顺序等,因此得到的结果可能并不准确。

因此,我们通常使用事前估算方法,通过分析算法的时间复杂度来预测其性能。时间复杂度是对算法执行时间增长速度的一种度量,它描述的是输入数据规模n与算法执行时间的关系。在时间复杂度的计算中,我们通常只关心最高次项,因为它在n足够大的时候,将主导整个时间复杂度。

2.1 度量一个程序执行时间两种方法

事后统计方法
这种方法可行,但是存在于两个问题:一是要想对设计的算法运行性能进行评测就需要实际去运行该程序,而是所得时间统计量依赖于计算机硬件、软件等因素,这种方式要在同一台计算机的相同状态下运行,才能比较出哪一个算法速度更快,更好。
事前估算方法
通过分析某一个算法的时间复杂度来判断哪个算法更优,更好。

2.2 时间频度

时间频度:一个算法花费的时间与算法中语句的执行次数成正比,哪一个算法中语句执行次数多,那么他所花费的时间就会多。 一个算法中语句执行次数称之为语句频度或时间频度。记为T(n)

int sum = 0;
for(int i=1;i<=n;i++){
  sum+=i;
}
n = 100; 
T(n) = n+1;
n*2/100
T(n)  =1;

忽略常数项:
在这里插入图片描述

结论:

1、 2n+20 和 2n随着n变大,执行曲线无线接近,20可以忽略
2、 3n+10 和 3n随着n变大,执行曲线无限接近,10可以忽略

忽略低次项:
在这里插入图片描述

结论:

1、2n2+3n+10 和2n2随着n变大,执行曲线无线接近,可以忽略3n+10
2、n2+5n+20 和n2 随着n变大,执行曲线无线接近,可以忽略5n+20

忽略系数:
在这里插入图片描述

结论:

1、 随着n值变大,5n2+7n 和 3n2+2n执行区间重合,说明这种情况下5和3可以忽略
2、 而n3 +5n和6n3+4n执行区间分离,说明多少次方式关键

2.3 时间复杂度

在计算机科学中,时间复杂性,又称时间复杂度,算法的时间复杂度是一个函数,它定性描述该算法的运行时间。这是一个代表算法输入值的字符串的长度的函数。时间复杂度常用大O符号表述,不包括这个函数的低阶项和首项系数。使用这种方式时,时间复杂度可被称为是渐近的,渐近时间复杂度又称之为时间复杂度。
在这里插入图片描述

2.4 常见的时间复杂度

1、常数时间
若对于一个算法,的上界与输入大小无关,则称其具有常数时间,记作O(1)时间
T(n) =1
2、对数时间
若算法的T(n) =O(logn),则称其具有对数时间

int I = 1;
while(i<n){
 i=i*2;
}

x=log2n O(log2n)

3、幂对数时间
对于某个常数k,若算法的T(n) = O((logn)),则称其具有幂对数时间

4、次线性时间
对于一个算法,若其匹配T(n) = o(n),则其时间复杂度为次线性时间(sub-linear time或sublinear time)。
5、线性时间
如果一个算法的时间复杂度为O(n),则称这个算法具有线性时间,或O(n)时间。

for(i=1;i<=n;++i){
  j=I;
j++;
}

6、线性对数时间
若一个算法时间复杂度T(n) = O(nlog n),则称这个算法具有线性对数时间
7、指数时间
若T(n) 是以 2为上界,其中 poly(n) 是n的多项式,则算法被称为指数时间

常见的时间复杂度对应图:
在这里插入图片描述

结论:
1、 常见的算法时间复杂度由小到大依次为:O(1)<O(log2n)<O(n)<O(nlog2n)<O(n2)<O(n3)<O(nk)<O(2n)<Ο(n!)
2、 尽可能的避免使用指数阶的算法

2.5 平均和最坏时间复杂度

平均时间复杂度是指所有可能的输入实例均以等概率的出现情况下得到算法的运行时间
最坏时间复杂度,一般讨论的时间复杂度均是最坏情况下的时间复杂度,这样做的原因是最坏情况下的时间复杂度是算法在任何输入实例上运行的界限,这就保证了算法的运行时间不会比最坏情况更长。
平均时间复杂度和最坏时间复杂度是否一样,这就需要根据算法不同而不同了。
在这里插入图片描述

3. 常见排序算法详解

3.1 基数排序 (Radix Sort)

基数排序是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。即所有的待比较数值统一设置为同样的数位长度,位数比较短的数前面补零,然后从最地位开始依次进行一次排序,这样从最低位排序一直到最高位排序完成以后,数列就变成一个有序序列。

(1) 算法过程

  1. 取得数组中的最大数,并取得位数;
  2. 对数组按照"指定的位数"进行稳定的排序;
  3. 从最低位开始,依次进行一次排序;
  4. 从最低位排序一直到最高位排序完成以后, 数组就变成一个有序序列。

这个过程是稳定的,也就是说,两个元素相等,它们的相对顺序不会改变。基数排序的时间复杂度为O(nk),其中n是排序元素的数量,k是数字的最大长度。
我们来看一个详细的过程:

(2)代码实现

假设我们要对一个列表进行排序,我们可以使用以下java代码实现基数排序:

import java.util.*;

public class RadixSort {
    public static void radixsort(int arr[], int n) {
        int m = getMax(arr, n);

        for (int exp = 1; m/exp > 0; exp *= 10)
            countSort(arr, n, exp);
    }

    static int getMax(int arr[], int n) {
        int mx = arr[0];
        for (int i = 1; i < n; i++)
            if (arr[i] > mx)
                mx = arr[i];
        return mx;
    }

    static void countSort(int arr[], int n, int exp) {
        int output[] = new int[n];
        int i;
        int count[] = new int[10];
        Arrays.fill(count,0);

        for (i = 0; i < n; i++)
            count[ (arr[i]/exp)%10 ]++;

        for (i = 1; i < 10; i++)
            count[i] += count[i - 1];

        for (i = n - 1; i >= 0; i--) {
            output[count[ (arr[i]/exp)%10 ] - 1] = arr[i];
            count[ (arr[i]/exp)%10 ]--;
        }

        for (i = 0; i < n; i++)
            arr[i] = output[i];
    }
}

总结一下,基数排序的优点在于,对于长度为k的n个数字来说,时间复杂度可以达到线性O(nk),这对于非常大的数据量和大范围的数据来说,是很高效的一种排序算法。然而,基数排序算法实现起来相对较复杂,需要额外的存储空间,这可能是其在实际使用中较少被选择的一个原因。

3.2 冒泡排序 (Bubble Sort)

冒泡排序是一种简单的排序算法。它重复地遍历待排序的序列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。遍历序列的工作是重复地进行直到没有再需要交换,也就是说该序列已经排序完成。

(1) 算法过程

  1. 比较相邻的元素。如果第一个比第二个大(升序),就交换它们两个;
  2. 对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对,最后的元素应该会是最大的数;
  3. 针对所有的元素重复以上的步骤,除了最后一个;
  4. 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
    在这里插入图片描述
    特点:

1、 需要循环array.length-1次 外层循环
2、 每次排序的次数逐步递减
3、 也可能存在本次排序没有发生变化

(2) 代码实现

以下是冒泡排序的一个Java实现:

public class BubbleSort {
    void bubbleSort(int arr[]) {
        int n = arr.length;
        for (int i = 0; i < n-1; i++)
            for (int j = 0; j < n-i-1; j++)
                if (arr[j] > arr[j+1]) {
                    // swap arr[j+1] and arr[j]
                    int temp = arr[j];
                    arr[j] = arr[j+1];
                    arr[j+1] = temp;
                }
    }
}

3.3 快速排序 (Quick Sort)

快速排序是一种高效的排序算法,是对冒泡排序的一种改进,使用了分治的思想。算法选择一个元素作为“基准”,将要排序的数据分割成两部分,一部分的所有数据都比另一部分的所有数据要小。然后再按此方法对这两部分数据分别进行快速排序。它是一种被广泛使用的排序算法,性能良好的实现的期望时间复杂度为O(n log n)。

(1) 算法过程

  1. 从数列中挑出一个元素,称为"基准"(pivot);
  2. 重新排序数列,所有比基准值小的元素摆放在基准前面,所有比基准值大的元素摆在基准后面(相同的数可以到任何一边)。在这个分割结束之后,对基准值的排序就已经完成;
  3. 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列进行排序。
    在这里插入图片描述

(2) 代码实现

以下是快速排序的一个Java实现:

class QuickSort {
    int partition(int arr[], int low, int high) {
        int pivot = arr[high];
        int i = (low-1); // index of smaller element
        for (int j=low; j<high; j++) {
            if (arr[j] < pivot) {
                i++;
                // swap arr[i] and arr[j]
                int temp = arr[i];
                arr[i] = arr[j];
                arr[j] = temp;
            }
        }
        // swap arr[i+1] and arr[high] (or pivot)
        int temp = arr[i+1];
        arr[i+1] = arr[high];
        arr[high] = temp;

        return i+1;
    }
 
    void sort(int arr[], int low, int high) {
        if (low < high) {
            int pi = partition(arr, low, high);
            sort(arr, low, pi-1);
            sort(arr, pi+1, high);
        }
    }
}

总结一下,冒泡排序和快速排序都是比较型排序,但冒泡排序是稳定排序,而快速排序是不稳定的排序。对于冒泡排序,时间复杂度为O(n²),空间复杂度为O(1);而快速排序,最好情况下时间复杂度为O(n log n),最坏情况为O(n²),平均情况为O(n log n),空间复杂度为O(log n)。

3.4 插入排序 (Insertion Sort)

插入排序是一种简单的排序算法,它模仿了人们整理扑克牌的方式。它的工作原理是通过构造一个有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常采用in-place排序,即只需用到O(1)的额外空间的排序,最坏时间复杂度为O(n^2),使得插入排序适用于数据量小的排序。

(1) 算法过程

  1. 从第一个元素开始,该元素可以认为已经被排序;
  2. 取出下一个元素,在已经排序的元素序列中从后向前扫描;
  3. 如果该元素(已排序)大于新元素,将该元素移到下一位置;
  4. 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置;
  5. 将新元素插入到该位置后;
  6. 重复步骤2~5。
    在这里插入图片描述

(2) 代码实现

以下是插入排序的一个Java实现:

public class InsertionSort {
    void insertionSort(int arr[]) {
        int n = arr.length;
        for (int i = 1; i < n; ++i) {
            int key = arr[i];
            int j = i - 1;

            while (j >= 0 && arr[j] > key) {
                arr[j + 1] = arr[j];
                j = j - 1;
            }
            arr[j + 1] = key;
        }
    }
}

3.5 选择排序 (Selection Sort)

选择排序是一种简单直观的排序算法,无论什么数据进去都是O(n²)的时间复杂度。所以用到它的时候,数据规模越小越好。

(1) 算法过程

  1. 首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置;
  2. 再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。
  3. 重复第二步,直到所有元素均排序完毕。
    在这里插入图片描述

(2) 代码实现

以下是选择排序的一个Java实现:

public class SelectionSort {
    void selectionSort(int arr[]) {
        int n = arr.length;

        for (int i = 0; i < n-1; i++) {
            // Find the minimum element in unsorted array
            int min_idx = i;
            for (int j = i+1; j < n; j++)
                if (arr[j] < arr[min_idx])
                    min_idx = j;

            // Swap the found minimum element with the first element
            int temp = arr[min_idx];
            arr[min_idx] = arr[i];
            arr[i] = temp;
        }
    }
}

总结一下,插入排序和选择排序也是比较型排序,且它们都是稳定的排序方法。对于插入排序,时间复杂度为O(n²),空间复杂度为O(1);而选择排序,时间复杂度为O(n²),空间复杂度为O(1)。尽管在最坏情况下,这两种算法都需要进行O(n²)次比较,但是插入排序在输入数据接近或已经排序的情况下,表现更优。

3.6 希尔排序 (Shell Sort)

希尔排序,也称递减增量排序,是插入排序的一种更高效的改进版本。

(1) 算法过程

希尔排序的基本思想是将数组列在一个表中并对列分别进行插入排序,重复这过程,不过每次使用一短的间隔(称为增量),然后将开始时用的最大增量减小(例如减半)。当增量减至1时,整个文件恰被分成一列,算法便终止。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

(2) 代码实现

以下是希尔排序的一个Java实现:

public class ShellSort {
    void shellSort(int arr[]) {
        int n = arr.length;
 
        for (int gap = n / 2; gap > 0; gap /= 2) {
            for (int i = gap; i < n; i += 1) {
                int temp = arr[i];

                int j;
                for (j = i; j >= gap && arr[j - gap] > temp; j -= gap)
                    arr[j] = arr[j - gap];

                arr[j] = temp;
            }
        }
    }
}

3.7 归并排序 (Merge Sort)

归并排序(Merge Sort)是建立在归并操作上的一种有效,稳定的排序算法,适用于大规模数据。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。

(1) 算法过程

归并排序采用分治法(Divide and Conquer)的思想。首先将大问题分解为小问题(将待排序序列分解为尽可能相等的两部分),然后对各个小问题进行解决(对每部分分别进行排序),最后将解决小问题的答案合并起来解决原来的大问题(将两个有序的子序列合并成一个有序序列)。
在这里插入图片描述
我们需要将两个已经有序的子序列合并成一个有序序列,比如上图最后一次合并,将[2,4,5,6]和[1,3,7,8]已经有序的子序列合并最终序列[1,2,3,4,5,6,7,8]

在这里插入图片描述

(2) 代码实现

以下是归并排序的一个Java实现:

public class MergeSort {
    void merge(int arr[], int left, int middle, int right) {
        int n1 = middle - left + 1;
        int n2 = right - middle;

        int leftArray[] = new int [n1];
        int rightArray[] = new int [n2];

        for (int i=0; i<n1; ++i)
            leftArray[i] = arr[left + i];
        for (int j=0; j<n2; ++j)
            rightArray[j] = arr[middle + 1+ j];

        int i = 0, j = 0;
 
        int k = left;
        while (i < n1 && j < n2) {
            if (leftArray[i] <= rightArray[j]) {
                arr[k] = leftArray[i];
                i++;
            } else {
                arr[k] = rightArray[j];
                j++;
            }
            k++;
        }

        while (i < n1) {
            arr[k] = leftArray[i];
            i++;
            k++;
        }

        while (j < n2) {
            arr[k] = rightArray[j];
            j++;
            k++;
        }
    }
 
    void sort(int arr[], int left, int right) {
        if (left < right) {
            int middle = (left+right)/2;

            sort(arr, left, middle);
            sort(arr , middle+1, right);

            merge(arr, left, middle, right);
        }
    }
}

希尔排序和归并排序都是有效的排序算法。希尔排序是一种插入排序的改进版本,其时间复杂度为O(n log n);而归并排序使用了分治策略,其时间复杂度为O(n log n),但需要O(n)的额外空间。在对效率要求较高的场景中,这两种排序方法都是不错的选择。

4. 结语

本文主要详细介绍了常见的7种排序算法:基数排序、冒泡排序、快速排序、插入排序、选择排序、希尔排序和归并排序。我们针对每一种算法都给出了算法过程的详细说明,以及对应的Java实现。每种排序算法都有其特定的应用场景,了解和掌握这些算法,可以帮助我们更好地解决实际问题。

值得注意的是,排序算法的效率会受到数据规模和数据分布的影响。因此,选择排序算法时,除了考虑其时间和空间复杂度外,还需要根据实际情况选择最适合的算法。例如,对于小规模或者部分有序的数据,插入排序可能是一个不错的选择。而对于大规模的数据,我们可能需要选择时间复杂度较低的排序算法,如快速排序、归并排序等。

这些排序算法在计算机科学和软件工程领域都有着广泛的应用,是每一个程序员必备的基础知识。希望本文的内容对你有所帮助,如果有任何问题或者建议,欢迎留言讨论。

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

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

相关文章

2023年7月2日leetcode每日一题打卡——125.验证回文串

一、题目描述与要求 125. 验证回文串 - 力扣&#xff08;LeetCode&#xff09; 题目描述 如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后&#xff0c;短语正着读和反着读都一样。则可以认为该短语是一个 回文串 。 字母和数字都属于字母数字字符。 给…

学习系统编程No.28【多线程概念实战】

引言&#xff1a; 北京时间&#xff1a;2023/6/29/15:33&#xff0c;刚刚更新完博客&#xff0c;目前没什么状态&#xff0c;不好趁热打铁&#xff0c;需要去睡一会会&#xff0c;昨天睡的有点迟&#xff0c;然后忘记把7点到8点30之间的4个闹钟关掉了&#xff0c;恶心了我自己…

C语言学习(三十)---枚举、位段、联合体

这几天在往实习的地方弄东西&#xff0c;比较累&#xff0c;因此没有更新&#xff0c;在几天前我们学习了内存操作函数&#xff0c;其与之前学习的字符串操作函数相比&#xff0c;适用范围更加广泛&#xff0c;大家要注意掌握学习&#xff0c;今天我们将学习枚举、位段和联合体…

闲置BROOKSTONE Rover间谍车重生记

22年春节在家&#xff0c;哪也去不了&#xff0c;收拾出来一个多年前的玩具&#xff0c;全名叫BROOKSTONE Rover revolution&#xff0c;长这个样子。 尽管是7年前的产品了&#xff0c;科技感依旧挺足 印象中能手机控制&#xff0c;并且能语音对讲。只是网上找到的安卓版应用已…

xenomai内核解析--xenomai实时线程创建流程

版权声明&#xff1a;本文为本文为博主原创文章&#xff0c;未经同意&#xff0c;禁止转载。如有错误&#xff0c;欢迎指正&#xff0c;博客地址&#xff1a;https://blog.csdn.net/qq_22654551?typeblog 文章目录 问题概述1 libCobalt中调用非实时POSIX接口2 阶段1 linux线程…

02_jQuery与Ajax

jquery jquery的作用 他是js的库 处理html,事件,实现动画效果,方便的为网站提供AJAX交互 命名格式 .ji:体积大,用于学习和debug使用 .min.js:压缩的文件,体积小,用于线上环境使用 使用方法 必须先在页面文件中进行引用 $就是jQuery 注意: jQuery是DOM的封装 jQuery和…

Spring Boot 中的服务网关是什么,原理,如何使用

Spring Boot 中的服务网关是什么&#xff0c;原理&#xff0c;如何使用 在微服务架构中&#xff0c;服务网关是一个非常重要的组件。它可以作为所有微服务的入口&#xff0c;负责路由、负载均衡、安全性和监控等方面的功能。Spring Boot 提供了一系列的服务网关工具&#xff0…

redis-哨兵安装

解决问题 自动故障修复 1.在主从模式的基础上,在主节点添加自己的认证密码即可 2.将代码客户端地址改为哨兵地址 ------------- 主节点配置 daemonize yes port 6379 bind 0.0.0.0 requirepass 123456 save 3600 1 300 100 60 10000dir /usr/local/redis dbfilename dump.r…

Java POI (4)—— Linux环境下文件解析过程出现OOM的问题

Excel文件在进行解析的时候&#xff0c;在Windows环境中&#xff0c;没用报错&#xff0c;但是在Linux环境中&#xff0c;出现了如下的报错&#xff1a; nested exception is javalang.OutofMemoryError: Java heap space &#xff08;OOM&#xff09; 一、内存溢出和栈溢出有什…

主流特征工程平台(一)

一. 目标 对于Feature Store的能力与边界&#xff0c;每家的定义略微不同&#xff0c;《Feature Stores - A Hierarchy of Needs》&#xff09;这篇文章做了很好的总结&#xff0c;大体分为如下几个层次&#xff1a; 特征管理&#xff1a;特征抽取、处理、存储、元数据管理&am…

群晖NAS 安装 MySQL 远程访问连接

目录 1. 安装Mysql 2. 安装phpMyAdmin 3. 修改User 表 4. 本地测试连接 5. 安装cpolar 6. 配置公网访问地址 7. 固定连接公网地址 [TOC] > **转载自cpolar极点云文章&#xff1a;[群晖NAS 安装 MySQL远程访问连接](https://www.cpolar.com/blog/install-mysql-remote-…

Spring 事务使用详解

前言 什么是事务&#xff1f;根据 维基百科事务 介绍&#xff0c;数据库事务&#xff08;简称&#xff1a;事务&#xff09;是数据库管理系统执行过程中的一个逻辑单位&#xff0c;由一个有限的数据库操作序列构成。简单来说&#xff0c;事务就是将一系列操作当成一个不可拆分…

报喜鸟如何触发数字化转型及品牌扩张战略分析

传统服装企业往往面临缺乏创新、盲目扩张、追求低成本、库存和行业周期性等问题。报喜鸟通过深入分析市场需求&#xff0c;明确聚焦主业&#xff0c;提出加强品牌核心竞争力的价值主张。通过实施DTC转型&#xff0c;发力电商平台和线下门店等举措&#xff0c;报喜鸟成功提高品牌…

VSC++=》 指针实数排序

缘由https://bbs.csdn.net/topics/396523482 void 指针实数排序(double* aa, int d) {//缘由https://bbs.csdn.net/topics/396523482double lin 0; int j d, jj 0;while (jj < d) if (--j > jj) if (aa[j] > aa[j - 1])lin aa[j], aa[j] aa[j - 1], aa[j - 1] …

Flask request和requests(客户端服务器)

Flask request和requests 1、Flask request属性2、requests属性3、实现代码 1、Flask request属性 这么多属性什么时候有值什么时候没值&#xff0c;其实完全取决于我们请求头content-type是什么&#xff0c;如果是以表单形式multipart/form-data、application/x-www-form-url…

辅助驾驶功能开发-功能规范篇(21)-3-XP行泊一体方案功能规范

XPilot Parking 自动泊车系统 七、全自动泊车(AutoParking) • 自动泊车辅助(AutoParking Assist)、斜列式车位泊车辅助(Diagonal AutoParking Assist) - 产品定义 基于超声波传感器和环视摄像头对空间和车位的识别,通过自动泊车系统实现全自动泊车入库。 - 功能说…

使用HHDESK图形化功能管理服务器

服务器的管理通常繁琐而枯燥&#xff0c;需要大量的命令行来执行。 所以图形化功能应运而生。 本篇以传输文件为例&#xff0c;简单介绍一下HHDESK的图形化管理功能。 首先需要配置好服务器。 点击连接管理&#xff0c;在连接类型中选择SSH&#xff0c;按照刚才在服务器中配…

方波信号轨迹跟踪(过冲与圆角)

在控制系统中&#xff0c;方波信号轨迹跟踪可能会面临过冲和圆角的问题。过冲是指跟踪信号超过期望值的现象&#xff0c;而圆角是指在方波信号变化时产生平滑的过渡。这些问题主要是因为传统的控制方法无法完美跟踪非线性的方波信号导致的。 过冲通常也称为超调。在方波信号的…

C++中的vector使用详解及重要部分底层实现

本篇文章会对vector的语法使用进行详解。同时&#xff0c;还会对重要难点部分的底层实现进行讲解。其中有vector的迭代器失效和深拷贝问题。希望本篇文章的内容会对你有所帮助。 目录 一、vector 简单概述 1、1 C语言中数组的不便 1、2 C中的动态数组容器vector 二、vector的常…

vue中实现div可编辑,并插入指定元素,样式

前言&#xff1a; vue中实现一个既可以编辑内容&#xff0c;有可以动态编辑内容插入一个带有样式的内容&#xff0c;改变默认内容后&#xff0c;这个样式消失的效果&#xff0c;这里来整理下调研与解决实现问题之路。 实现最终效果&#xff1a;图2为默认内容 1、可以光标点击任…