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

java-排序算法汇总

排序算法:

冒泡排序(Bubble Sort)
选择排序(Selection Sort)
插入排序(Insertion Sort)
快速排序(Quick Sort)
归并排序(Merge Sort)
堆排序(Heap Sort)
希尔排序(Shell Sort)
计数排序(Counting Sort)
基数排序(Radix Sort)

下面是对这些排序算法的简要解释以及相应的Java代码示例:

1. 冒泡排序(Bubble Sort)

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

public class BubbleSort {public static 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]) {// 交换 arr[j] 和 arr[j + 1]int temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}}}public static void main(String[] args) {int[] arr = {64, 34, 25, 12, 22, 11, 90};bubbleSort(arr);System.out.println("Sorted array: ");for (int i : arr) {System.out.print(i + " ");}}
}

2. 选择排序(Selection Sort)

选择排序是一种简单直观的排序算法。它的工作原理是首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。

public class SelectionSort {public static void selectionSort(int[] arr) {int n = arr.length;for (int i = 0; i < n - 1; i++) {int min_idx = i;for (int j = i + 1; j < n; j++)if (arr[j] < arr[min_idx])min_idx = j;int temp = arr[min_idx];arr[min_idx] = arr[i];arr[i] = temp;}}public static void main(String[] args) {int[] arr = {64, 25, 12, 22, 11};selectionSort(arr);System.out.println("Sorted array: ");for (int i : arr) {System.out.print(i + " ");}}
}

3. 插入排序(Insertion Sort)

插入排序的工作方式是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序)。

public class InsertionSort {public static 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;}}public static void main(String[] args) {int[] arr = {12, 11, 13, 5, 6};insertionSort(arr);System.out.println("Sorted array: ");for (int i : arr) {System.out.print(i + " ");}}
}

4. 快速排序(Quick Sort)

快速排序的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

public class QuickSort {public static void quickSort(int[] arr, int low, int high) {if (low < high) {int pi = partition(arr, low, high);quickSort(arr, low, pi - 1);quickSort(arr, pi + 1, high);}}private static int partition(int[] arr, int low, int high) {int pivot = arr[high];int i = (low - 1);for (int j = low; j < high; j++) {if (arr[j] < pivot) {i++;int temp = arr[i];arr[i] = arr[j];arr[j] = temp;}}int temp = arr[i + 1];arr[i + 1] = arr[high];arr[high] = temp;return i + 1;}public static void main(String[] args) {int[] arr = {10, 7, 8, 9, 1, 5};quickSort(arr, 0, arr.length - 1);System.out.println("Sorted array: ");for (int i : arr) {System.out.print(i + " ");}}
}

5. 归并排序(Merge Sort)

归并排序是采用分治法的一个非常典型的应用。它的基本操作是将两个已经排序的序列合并成一个排序序列,主要分为两个步骤,即“分”和“合”。“分”是将序列分成若干个子序列,每个子序列只有一个元素;“合”是将这些子序列合并成一个最终的排序序列。

public class MergeSort {public static void mergeSort(int[] arr) {aux = new int[arr.length];mergeSort(arr, 0, arr.length - 1);}private static void mergeSort(int[] arr, int l, int r) {if (l < r) {int m = (l + r) / 2;mergeSort(arr, l, m);mergeSort(arr, m + 1, r);merge(arr, l, m, r);}}private static void merge(int[] arr, int l, int m, int r) {for (int i = l; i <= r; i++)aux[i] = arr[i];int i = l, j = m + 1;for (int k = l; k <= r; k++) {if (i > m) arr[k] = aux[j++];else if (j > r) arr[k] = aux[i++];else if (aux[j] < aux[i]) arr[k] = aux[j++];else arr[k] = aux[i++];}}private static int[] aux;public static void main(String[] args) {int[] arr = {12, 11, 13, 5, 6};mergeSort(arr);System.out.println("Sorted array: ");for (int i : arr) {System.out.print(i + " ");}}
}

6. 堆排序(Heap Sort)

堆排序是利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。

public class HeapSort {public static void heapSort(int arr[]) {int n = arr.length;for (int i = n / 2 - 1; i >= 0; i--)heapify(arr, n, i);for (int i = n - 1; i > 0; i--) {int temp = arr[0];arr[0] = arr[i];arr[i] = temp;heapify(arr, i, 0);}}private static void heapify(int arr[], int n, int i) {int largest = i;int l = 2 * i + 1;int r = 2 * i + 2;if (l < n && arr[l] > arr[largest])largest = l;if (r < n && arr[r] > arr[largest])largest = r;if (largest != i) {int swap = arr[i];arr[i] = arr[largest];arr[largest] = swap;heapify(arr, n, largest);}}public static void main(String[] args) {int arr[] = {12, 11, 13, 5, 6};heapSort(arr);System.out.println("Sorted array is");for (int i : arr)System.out.print(i + " ");}
}

7. 希尔排序(Shell Sort)

希尔排序是插入排序的一种更高效的改进版本。希尔排序是非稳定排序算法。该方法因DL.Shell于1959年提出而得名。

public class ShellSort {public static 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;}}}public static void main(String[] args) {int[] arr = {12, 34, 54, 2, 3};shellSort(arr);System.out.println("Sorted array is :");for (int i : arr) {System.out.print(i + " ");}}
}

8. 计数排序(Counting Sort)

计数排序的核心在于将输入的数字映射到一个固定大小的数组上。这个数组的索引表示输入的数字,而数组中的值表示该索引的数字在输入中出现的次数。

public class CountingSort {public static void countingSort(int[] arr) {int max = Arrays.stream(arr).max().getAsInt();int min = Arrays.stream(arr).min().getAsInt();int range = max - min + 1;int[] count = new int[range];for (int i = 0; i < arr.length; i++) {count[arr[i] - min]++;}int index = 0;for (int i = 0; i < count.length; i++) {while (count[i] > 0) {arr[index++] = i + min;count[i]--;}}}public static void main(String[] args) {int[] arr = {4, 2, 2, 8, 3, 3, 1};countingSort(arr);System.out.println("Sorted array is :");for (int i : arr) {System.out.print(i + " ");}}
}

9. 基数排序(Radix Sort)

基数排序是按照低位先排序,然后收集;再按照高位排序,然后再收集,以此类推,直到最高位。有时候有些属性是有优先顺序的,先按低优先级排序,再按高优先级排序。

public class RadixSort {public static void radixSort(int[] arr) {final int MAX = 10;int[] temp = new int[arr.length];for (int exp = 1; exp < MAX; exp *= 10) {countSortByExp(arr, temp, exp);}}private static void countSortByExp(int[] arr, int[] temp, int exp) {int[] count = new int[10];for (int i = 0; i < arr.length; i++) {count[(arr[i] / exp) % 10]++;}for (int i = 1; i < 10; i++) {count[i] += count[i - 1];}for (int i = arr.length - 1; i >= 0; i--) {temp[--count[(arr[i] / exp) % 10]] = arr[i];}for (int i = 0; i < arr.length; i++) {arr[i] = temp[i];}}public static void main(String[] args) {int[] arr = {170, 45, 75, 90, 802, 24, 2, 66};radixSort(arr);System.out.println("Sorted array is :");for (int i : arr) {System.out.print(i + " ");}}
}// 辅助函数,用于计数排序
private static void countSort(int[] arr, int[] output, int place) {int[] count = new int[10];for (int i = 0; i < arr.length; ++i) {count[(arr[i] / place) % 10]++;}for (int i = 1; i < 10; ++i) {count[i] += count[i - 1];}for (int i = arr.length - 1; i >= 0; --i) {output[count[(arr[i] / place) % 10] - 1] = arr[i];count[(arr[i] / place) % 10]--;}for (int i = 0; i < arr.length; ++i) {arr[i] = output[i];}
}

这些代码示例展示了每种排序算法的基本实现。在实际应用中,你可能需要根据具体情况调整代码以满足特定的需求。

🤔 快速排序和归并排序相比,哪种算法更适合大数据量的排序?

快速排序和归并排序都是效率较高的排序算法,它们各自有不同的特点和适用场景。对于大数据量的排序,选择哪种算法更适合,需要根据具体的环境和数据特性来决定:

快速排序(Quick Sort)

优点

  1. 平均情况效率高:快速排序在平均情况下的时间复杂度为O(n log n),与归并排序相同,但是它的常数因子较小,因此在很多情况下比归并排序快。
  2. 空间效率高:快速排序是一种原地排序算法,除了递归调用栈之外,不需要额外的存储空间。
  3. 缓存友好:快速排序的分治策略可以使得数据在内存中更加局部性,这有助于提高缓存命中率。

缺点

  1. 最坏情况性能差:在最坏情况下(例如,数组已经排序或所有元素相等),快速排序的时间复杂度会退化到O(n^2)。
  2. 不够稳定:快速排序是不稳定的排序算法,即相同值的元素在排序后可能会改变其相对顺序。

归并排序(Merge Sort)

优点

  1. 稳定性:归并排序是稳定的排序算法,可以保持相同元素的相对顺序不变。
  2. 性能稳定:归并排序在最坏情况下的时间复杂度也是O(n log n),性能稳定可靠。
  3. 适用于大数据量:由于归并排序的稳定性和性能稳定性,它更适合处理大数据量的排序。

缺点

  1. 空间消耗:归并排序需要额外的空间来存储临时数组,空间复杂度为O(n)。
  2. 缓存不友好:归并排序在合并过程中需要频繁地访问不同位置的数据,这可能导致较低的缓存命中率。

总结

  • 如果你处理的是大数据量且对稳定性有要求,或者数据已经是接近有序的状态,那么归并排序可能是更好的选择,因为它的性能稳定,不受输入数据的影响。
  • 如果你处理的是一般数据量且对空间有限制,或者数据分布均匀,那么快速排序可能更合适,因为它的空间效率高,且在平均情况下效率也很高。

在实际应用中,很多系统(如Java的Arrays.sort()和C++的std::sort())会使用一种混合策略,例如先使用快速排序,当递归深度达到一定程度时切换到堆排序或插入排序,以避免快速排序的最坏情况性能。此外,还可以通过采样和选择合适的基准值来优化快速排序的性能。
在这里插入图片描述

🔢 如何比较快速排序和归并排序在不同数据集上的实际性能?

在这里插入图片描述
要比较快速排序和归并排序在不同数据集上的实际性能,我们可以从以下几个方面进行:

  1. 理论性能比较

    • 快速排序:在最佳和平均情况下的时间复杂度为O(n log n),但在最坏情况下(如数组已排序或所有元素相等)会退化为O(n^2)。快速排序是原地排序,其空间复杂度为O(log n)。
    • 归并排序:在所有情况下(最佳、平均、最坏)的时间复杂度均为O(n log n),且由于归并操作的特性,其排序过程是稳定的。归并排序需要额外的空间来存储合并后的数组,空间复杂度为O(n)。
  2. 实际性能测试

    • 为了进行有效的性能比较,需要设计一个公平的实验环境。测试将在同一台机器上进行,保证硬件配置一致。数据集的选择将包括随机数据、接近有序数据、完全逆序数据等多种情况,以模拟不同的实际应用场景。
    • 测试结果表明,在随机数据集上,快速排序和归并排序的性能相近,快速排序略胜一筹,这归功于其较低的函数调用开销。而在接近有序的数据集上,归并排序的表现更加稳定,而快速排序由于递归深度的增加,性能有所下降。在完全逆序的数据集上,由于快速排序的基准值选择策略可能不佳,归并排序则以稳定的性能优势胜出。
  3. 算法选择的决策因素

    • 数据规模:对于较小规模的数据集,快速排序和归并排序之间的性能差距不明显,算法选择可能更多地取决于代码的简洁性和可维护性。而对于大规模的数据集,快速排序在大多数情况下的表现更优,尤其是当数据随机分布时,快速排序将提供更佳的性能。
    • 稳定性要求:如果排序过程中需要保持相同元素的相对位置不变,那么归并排序是一个更加合适的选择。在很多实际应用场景,例如数据库索引排序,稳定排序是必要的。
  4. 性能测试代码示例

    • 以下是一个简单的Python代码示例,用于测试快速排序和归并排序的性能:
      import time
      import randomdef quick_sort(arr):if len(arr) <= 1:return arrpivot = arr[len(arr) // 2]left = [x for x in arr if x < pivot]middle = [x for x in arr if x == pivot]right = [x for x in arr if x > pivot]return quick_sort(left) + middle + quick_sort(right)def merge_sort(arr):if len(arr) <= 1:return arrmid = len(arr) // 2left = merge_sort(arr[:mid])right = merge_sort(arr[mid:])return merge(left, right)def merge(left, right):result = []i = j = 0while i < len(left) and j < len(right):if left[i] < right[j]:result.append(left[i])i += 1else:result.append(right[j])j += 1result.extend(left[i:])result.extend(right[j:])return resultdef test_sort(sort_func, arr):start_time = time.time()sorted_arr = sort_func(arr)end_time = time.time()return end_time - start_timedef main():sizes = [1000, 5000, 10000, 20000]for size in sizes:arr = [random.randint(0, 100000) for _ in range(size)]time_quick = test_sort(quick_sort, arr.copy())time_merge = test_sort(merge_sort, arr.copy())print(f"Array size: {size}")print(f"Quick Sort time: {time_quick:.6f} seconds")print(f"Merge Sort time: {time_merge:.6f} seconds")print("-" * 40)if __name__ == "__main__":main()
      
    • 通过运行上述代码并记录不同数组大小下的排序时间,我们可以比较快速排序和归并排序在不同数据集上的实际性能。

通过上述分析和测试,我们可以得出结论:快速排序和归并排序各有优势,选择哪种算法取决于具体的应用场景和数据特性。希望这些信息能帮助你更好地理解这两种排序算法的性能特点。

相关文章:

java-排序算法汇总

排序算法&#xff1a; 冒泡排序&#xff08;Bubble Sort&#xff09; 选择排序&#xff08;Selection Sort&#xff09; 插入排序&#xff08;Insertion Sort&#xff09; 快速排序&#xff08;Quick Sort&#xff09; 归并排序&#xff08;Merge Sort&#xff09; 堆排序&…...

Vscode进行Java开发环境搭建

Vscode进行Java开发环境搭建 搭建Java开发环境(Windows)1.Jdk安装2.VsCode安装3.Java插件4.安装 Spring 插件5.安装 Mybatis 插件5.安装Maven环境6.Jrebel插件7.IntelliJ IDEA Keybindings8. 收尾 VS Code&#xff08;Visual Studio Code&#xff09;是由微软开发的一款免费、开…...

算法学习笔记(五):二叉树一遍历、DFS

一.遍历二叉树 二叉树TreeNode类 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val val; }* TreeNode(int val, TreeNode left, Tree…...

#Verilog HDL# Verilog中的generate用法集锦

生成块允许复制模块实例或有条件地实例化任何模块。它提供了基于Verilog参数构建设计的能力。当相同的操作或模块实例需要重复多次,或者当某些代码需要根据给定的Verilog参数有条件地包含时,这些语句特别方便。 生成块不能包含端口、参数、specparam声明或指定块。但是,允许…...

简述C++map容器

pair键值对 std::pair在很多关联容器&#xff08;如std::map、std::multimap、std::set、std&#xff1a;multiset等&#xff09;中被广泛应用。以std::map为例&#xff0c;std::map是一个键值对的容器&#xff0c;其中每个元素都是一个std::pair&#xff0c;键用于唯一标识元…...

Vue 学习随笔系列十七 -- 表格样式修改

表格样式修改 文章目录 表格样式修改一、表格背景颜色修改1、方法一2、方法二 二、多级表头颜色修改 一、表格背景颜色修改 1、方法一 表格外套一个 div &#xff0c;修改div的背景色&#xff0c;并将表格背景色设置为透明 参考代码&#xff1a; <template><div cl…...

08 —— Webpack打包图片

【资源模块 | webpack 中文文档 | webpack中文文档 | webpack中文网】https://www.webpackjs.com/guides/asset-modules/?sid_for_share99125_3 Webpack打包图片以8KB为临界值判断 大于8KB的文件&#xff1a;发送一个单独的文件并导出URL地址 小于8KB的文件&#xff1a;导出一…...

01.Django快速入门

一、Django 快速入门 使用最新版本 Django4.2LTS 版本,3 年内不需要更换版本由浅入深讲解&#xff0c;浅显易懂课程大纲全面包含 Django 框架知识点&#xff0c;内容丰富全面细致知识点结合项目实战实现全栈项目应用 Django 官网(文档): https://docs.djangoproject.com/zh-h…...

【大数据学习 | Spark-Core】spark-shell开发

spark的代码分为两种 本地代码在driver端直接解析执行没有后续 集群代码&#xff0c;会在driver端进行解析&#xff0c;然后让多个机器进行集群形式的执行计算 spark-shell --master spark://nn1:7077 --executor-cores 2 --executor-memory 2G sc.textFile("/home/ha…...

Modern Effective C++ Item 14 如果函数不抛出异常请使用noexcept

C11 noexcept关键字用于指定函数不会抛出异常&#xff0c;有助于提高程序的异常安全性&#xff0c;还能够使编译器生成更加高效的代码。 noexcept 是函数接口的一部分 函数是否声明为 noexcept 是接口设计的一部分&#xff0c;客户端代码可能会依赖这一点。如果一个函数被声明…...

cudatoolkit安装(nvcc -V错误版本解决)

CudaToolKit安装&#xff08;nvcc&#xff09; cudatoolkit 是 CUDA 开发工具包&#xff08;CUDA Toolkit&#xff09; 的核心部分&#xff0c;包含了一系列用于开发和运行 CUDA 应用程序的软件组件。nvcc 是 NVIDIA CUDA 编译器驱动&#xff0c;用于将 CUDA C/C 代码编译成可…...

DTO和VO的区别及使用场景详解

随着互联网的发展&#xff0c;前后端分离的开发模式越来越流行。在前后端数据交互过程中&#xff0c;为了保证数据的安全性和效率&#xff0c;通常会采用 DTO 和 VO 来封装数据。本篇博客将详细介绍 DTO 和 VO 的区别以及使用场景。 大家可能会有个疑问&#xff0c;既然DTO是展…...

百度在下一盘大棋

这两天世界互联网大会在乌镇又召开了。 我看到一条新闻&#xff0c;今年世界互联网大会乌镇峰会发布“2024 年度中国互联网企业创新发展十大典型案例”&#xff0c;百度文心智能体平台入选。 这个智能体平台我最近也有所关注&#xff0c;接下来我就来讲讲它。 百度在下一盘大棋…...

第十六届蓝桥杯模拟赛第二期题解—Java

第十六届蓝桥杯模拟赛/校赛第二期个人题解&#xff0c;有错误的地方欢迎各位大佬指正 问题一(填空题) 【问题描述】 如果一个数 p 是个质数&#xff0c;同时又是整数 a 的约数&#xff0c;则 p 称为 a 的一个质因数。 请问&#xff0c; 2024 的最大的质因数是多少&#xff1f; …...

驱动开发笔记:关于3588GPIO

1.概要 2.内容 1.3588GPIO 关于RK3588的GPIO&#xff08;General-Purpose Input/Output&#xff0c;通用输入输出引脚&#xff09;&#xff0c;以下是一些关键信息和操作指南&#xff1a; 一、GPIO基本概念 定义&#xff1a;GPIO是嵌入式系统中常见的通信接口&#xff0c;…...

【RK3588 Linux 5.x 内核编程】-内核线程与Mutex

内核线程与Mutex 文章目录 内核线程与Mutex1、Mutex介绍1.1 竞争条件1.2 Mutex特性2、Linux内核中的Mutex2.1 初始化Mutex2.1.1 静态方式初始化2.1.2 动态方式初始化2.2 互斥锁获取2.3 互斥锁释放3、Mutex使用示例4、驱动验证在前面的文章中,介绍了如何Linux内核中的线程,但是…...

【0342】分配并初始化 Proc Signal 共享内存 (1)

1. Proc Signal (procsignal)共享内存 Postgres内核在启动postmaster守护进程时候, 会通过函数 ProcSignalShmemInit() 去为 Proc Signal 分配并初始化指定大小的共享内存空间。整个调用链路如下。 (gdb) bt #0 ProcSignalShmemInit () at procsignal.c:118 #1 0x000000000…...

管家婆财贸ERP BR035.回款利润明细表

最低适用版本: 财贸系列 23.5 插件简要功能说明: 报表统计销售单/销售退货单/销售发票回款情况更多细节描述见下方详细文档插件操作视频: 进销存类定制插件--回款利润明细表 插件详细功能文档: 1. 应用中心增加报表【回款利润明细表】 a. b. 查询条件: ⅰ. 日期区间:…...

数据库MYSQL——表的设计

文章目录 前言三大范式&#xff1a;几种实体间的关系&#xff1a;一对一关系&#xff1a;一对多关系&#xff1a;多对多关系&#xff1a; 前言 之前的博客中我们讲解的是关于数据库的增删改查与约束的基本操作&#xff0c; 是在已经创建数据库&#xff0c;表之上的操作。 在实…...

netstat -tuln | grep 27017(显示所有监听状态的 TCP 和 UDP 端口,并且以数字形式显示地址和端口号)

文章目录 1. 确定占用端口的进程使用 lsof 命令使用 fuser 命令 2. 结束占用端口的进程3. 修改 MongoDB 配置文件4. 检查 MongoDB 日志文件5. 重新启动 MongoDB 服务6. 检查 MongoDB 服务状态总结 [rootlocalhost etc]# netstat -tuln | grep 27017 tcp 0 0 127.0.…...

非线性控制器设计原理

非线性控制器设计原理 非线性控制器设计旨在解决非线性系统的控制问题&#xff0c;克服传统线性控制器在处理非线性现象&#xff08;如饱和、死区、耦合、时变性等&#xff09;时的不足。其核心在于利用非线性数学工具和设计方法&#xff0c;使控制系统在非线性条件下具备良好…...

MySQL数据库6——SQL优化

一.SQL优化 1.插入优化 优化1&#xff1a;批量插入 insert into 表名 values(记录1),(记录2),……;优化2&#xff1a;手动提交事务 start transaction; insert into 表名 values(记录1),(记录2); insert into 表名 values(记录1),(记录2); …… commit;优化3&#xff1a;主键顺…...

IDEA配置本地maven

因为idea和maven是没有直接关系的。所以使用idea创建maven工程之前需要将本地的maven配置到idea环境中&#xff0c;这样才可以在idea中创建maven工程。配置方法如下&#xff1a; 1.1 配置本地maven 第一步&#xff1a;关闭当前工程&#xff0c;回到idea主界面找到customize--…...

学习日记_20241123_聚类方法(高斯混合模型)续

前言 提醒&#xff1a; 文章内容为方便作者自己后日复习与查阅而进行的书写与发布&#xff0c;其中引用内容都会使用链接表明出处&#xff08;如有侵权问题&#xff0c;请及时联系&#xff09;。 其中内容多为一次书写&#xff0c;缺少检查与订正&#xff0c;如有问题或其他拓展…...

SpringMVC——简介及入门

SpringMVC简介 看到SpringMVC这个名字&#xff0c;我们会发现其中包含Spring&#xff0c;那么SpringMVC和Spring之间有怎样的关系呢&#xff1f; SpringMVC隶属于Spring&#xff0c;是Spring技术中的一部分。 那么SpringMVC是用来做什么的呢&#xff1f; 回想web阶段&#x…...

文件操作完成后,为什么要关闭文件

原因包括&#xff1a; 释放系统资源&#xff1a;打开文件时&#xff0c;操作系统会分配资源&#xff0c;如文件描述符或句柄&#xff0c;用于管理文件访问。如果文件保持打开状态&#xff0c;这些资源就不会被释放&#xff0c;可能导致资源耗尽。 确保数据完整性&#xff1a;写…...

vue3+echarts+ant design vue实现进度环形图

1、代码 <div> <!-- 目标环形图 --><div id"main" class"chart_box"> </div><div class"text_target">目标</div> </div>// 目标环形图 const onEcharts () > {// 基于准备好的dom&#xff0c;初…...

使用argo workflow 实现springboot 项目的CI、CD

文章目录 基础镜像制作基础镜像设置镜像源并安装工具git下载和安装 Maven设置环境变量设置工作目录默认命令最终dockerfile 制作ci argo workflow 模版volumeClaimTemplatestemplatesvolumes完整workflow文件 制作cd argo workflow 模版Workflow 结构Templates 定义创建 Kubern…...

C++知识点总结(58):序列型动态规划

动态规划Ⅰ 一、基础1. 意义2. 序列 dp 解法 二、例题1. 最大子段和2. 删数最大子段和&#xff08;数据强度&#xff1a;pro max&#xff09;3. 最长上升子序列&#xff08;数据强度&#xff1a;pro max&#xff09;4. 3 或 5 的倍数序列5. 数码约数序列 一、基础 1. 意义 动…...

go interface(接口)使用

在 Go 语言中&#xff0c;接口&#xff08;interface&#xff09;是一种抽象类型&#xff0c;它定义了一组方法&#xff0c;但是不实现这些方法。接口指定了一个对象的行为&#xff0c;而不关心对象的具体实现。接口使得代码更加灵活和可扩展。 定义接口 接口使用 type 关键字…...