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)
优点:
- 平均情况效率高:快速排序在平均情况下的时间复杂度为O(n log n),与归并排序相同,但是它的常数因子较小,因此在很多情况下比归并排序快。
- 空间效率高:快速排序是一种原地排序算法,除了递归调用栈之外,不需要额外的存储空间。
- 缓存友好:快速排序的分治策略可以使得数据在内存中更加局部性,这有助于提高缓存命中率。
缺点:
- 最坏情况性能差:在最坏情况下(例如,数组已经排序或所有元素相等),快速排序的时间复杂度会退化到O(n^2)。
- 不够稳定:快速排序是不稳定的排序算法,即相同值的元素在排序后可能会改变其相对顺序。
归并排序(Merge Sort)
优点:
- 稳定性:归并排序是稳定的排序算法,可以保持相同元素的相对顺序不变。
- 性能稳定:归并排序在最坏情况下的时间复杂度也是O(n log n),性能稳定可靠。
- 适用于大数据量:由于归并排序的稳定性和性能稳定性,它更适合处理大数据量的排序。
缺点:
- 空间消耗:归并排序需要额外的空间来存储临时数组,空间复杂度为O(n)。
- 缓存不友好:归并排序在合并过程中需要频繁地访问不同位置的数据,这可能导致较低的缓存命中率。
总结
- 如果你处理的是大数据量且对稳定性有要求,或者数据已经是接近有序的状态,那么归并排序可能是更好的选择,因为它的性能稳定,不受输入数据的影响。
- 如果你处理的是一般数据量且对空间有限制,或者数据分布均匀,那么快速排序可能更合适,因为它的空间效率高,且在平均情况下效率也很高。
在实际应用中,很多系统(如Java的Arrays.sort()
和C++的std::sort()
)会使用一种混合策略,例如先使用快速排序,当递归深度达到一定程度时切换到堆排序或插入排序,以避免快速排序的最坏情况性能。此外,还可以通过采样和选择合适的基准值来优化快速排序的性能。
🔢 如何比较快速排序和归并排序在不同数据集上的实际性能?
要比较快速排序和归并排序在不同数据集上的实际性能,我们可以从以下几个方面进行:
-
理论性能比较:
- 快速排序:在最佳和平均情况下的时间复杂度为O(n log n),但在最坏情况下(如数组已排序或所有元素相等)会退化为O(n^2)。快速排序是原地排序,其空间复杂度为O(log n)。
- 归并排序:在所有情况下(最佳、平均、最坏)的时间复杂度均为O(n log n),且由于归并操作的特性,其排序过程是稳定的。归并排序需要额外的空间来存储合并后的数组,空间复杂度为O(n)。
-
实际性能测试:
- 为了进行有效的性能比较,需要设计一个公平的实验环境。测试将在同一台机器上进行,保证硬件配置一致。数据集的选择将包括随机数据、接近有序数据、完全逆序数据等多种情况,以模拟不同的实际应用场景。
- 测试结果表明,在随机数据集上,快速排序和归并排序的性能相近,快速排序略胜一筹,这归功于其较低的函数调用开销。而在接近有序的数据集上,归并排序的表现更加稳定,而快速排序由于递归深度的增加,性能有所下降。在完全逆序的数据集上,由于快速排序的基准值选择策略可能不佳,归并排序则以稳定的性能优势胜出。
-
算法选择的决策因素:
- 数据规模:对于较小规模的数据集,快速排序和归并排序之间的性能差距不明显,算法选择可能更多地取决于代码的简洁性和可维护性。而对于大规模的数据集,快速排序在大多数情况下的表现更优,尤其是当数据随机分布时,快速排序将提供更佳的性能。
- 稳定性要求:如果排序过程中需要保持相同元素的相对位置不变,那么归并排序是一个更加合适的选择。在很多实际应用场景,例如数据库索引排序,稳定排序是必要的。
-
性能测试代码示例:
- 以下是一个简单的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()
- 通过运行上述代码并记录不同数组大小下的排序时间,我们可以比较快速排序和归并排序在不同数据集上的实际性能。
- 以下是一个简单的Python代码示例,用于测试快速排序和归并排序的性能:
通过上述分析和测试,我们可以得出结论:快速排序和归并排序各有优势,选择哪种算法取决于具体的应用场景和数据特性。希望这些信息能帮助你更好地理解这两种排序算法的性能特点。
相关文章:

java-排序算法汇总
排序算法: 冒泡排序(Bubble Sort) 选择排序(Selection Sort) 插入排序(Insertion Sort) 快速排序(Quick Sort) 归并排序(Merge Sort) 堆排序&…...

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(Visual Studio Code)是由微软开发的一款免费、开…...

算法学习笔记(五):二叉树一遍历、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在很多关联容器(如std::map、std::multimap、std::set、std:multiset等)中被广泛应用。以std::map为例,std::map是一个键值对的容器,其中每个元素都是一个std::pair,键用于唯一标识元…...
Vue 学习随笔系列十七 -- 表格样式修改
表格样式修改 文章目录 表格样式修改一、表格背景颜色修改1、方法一2、方法二 二、多级表头颜色修改 一、表格背景颜色修改 1、方法一 表格外套一个 div ,修改div的背景色,并将表格背景色设置为透明 参考代码: <template><div cl…...

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

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

【大数据学习 | Spark-Core】spark-shell开发
spark的代码分为两种 本地代码在driver端直接解析执行没有后续 集群代码,会在driver端进行解析,然后让多个机器进行集群形式的执行计算 spark-shell --master spark://nn1:7077 --executor-cores 2 --executor-memory 2G sc.textFile("/home/ha…...
Modern Effective C++ Item 14 如果函数不抛出异常请使用noexcept
C11 noexcept关键字用于指定函数不会抛出异常,有助于提高程序的异常安全性,还能够使编译器生成更加高效的代码。 noexcept 是函数接口的一部分 函数是否声明为 noexcept 是接口设计的一部分,客户端代码可能会依赖这一点。如果一个函数被声明…...
cudatoolkit安装(nvcc -V错误版本解决)
CudaToolKit安装(nvcc) cudatoolkit 是 CUDA 开发工具包(CUDA Toolkit) 的核心部分,包含了一系列用于开发和运行 CUDA 应用程序的软件组件。nvcc 是 NVIDIA CUDA 编译器驱动,用于将 CUDA C/C 代码编译成可…...
DTO和VO的区别及使用场景详解
随着互联网的发展,前后端分离的开发模式越来越流行。在前后端数据交互过程中,为了保证数据的安全性和效率,通常会采用 DTO 和 VO 来封装数据。本篇博客将详细介绍 DTO 和 VO 的区别以及使用场景。 大家可能会有个疑问,既然DTO是展…...

百度在下一盘大棋
这两天世界互联网大会在乌镇又召开了。 我看到一条新闻,今年世界互联网大会乌镇峰会发布“2024 年度中国互联网企业创新发展十大典型案例”,百度文心智能体平台入选。 这个智能体平台我最近也有所关注,接下来我就来讲讲它。 百度在下一盘大棋…...
第十六届蓝桥杯模拟赛第二期题解—Java
第十六届蓝桥杯模拟赛/校赛第二期个人题解,有错误的地方欢迎各位大佬指正 问题一(填空题) 【问题描述】 如果一个数 p 是个质数,同时又是整数 a 的约数,则 p 称为 a 的一个质因数。 请问, 2024 的最大的质因数是多少? …...
驱动开发笔记:关于3588GPIO
1.概要 2.内容 1.3588GPIO 关于RK3588的GPIO(General-Purpose Input/Output,通用输入输出引脚),以下是一些关键信息和操作指南: 一、GPIO基本概念 定义:GPIO是嵌入式系统中常见的通信接口,…...
【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——表的设计
文章目录 前言三大范式:几种实体间的关系:一对一关系:一对多关系:多对多关系: 前言 之前的博客中我们讲解的是关于数据库的增删改查与约束的基本操作, 是在已经创建数据库,表之上的操作。 在实…...

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.…...
浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)
✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义(Task Definition&…...

STM32标准库-DMA直接存储器存取
文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA(Direct Memory Access)直接存储器存取 DMA可以提供外设…...
AI编程--插件对比分析:CodeRider、GitHub Copilot及其他
AI编程插件对比分析:CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展,AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者,分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...

多种风格导航菜单 HTML 实现(附源码)
下面我将为您展示 6 种不同风格的导航菜单实现,每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...

GitFlow 工作模式(详解)
今天再学项目的过程中遇到使用gitflow模式管理代码,因此进行学习并且发布关于gitflow的一些思考 Git与GitFlow模式 我们在写代码的时候通常会进行网上保存,无论是github还是gittee,都是一种基于git去保存代码的形式,这样保存代码…...

【JVM】Java虚拟机(二)——垃圾回收
目录 一、如何判断对象可以回收 (一)引用计数法 (二)可达性分析算法 二、垃圾回收算法 (一)标记清除 (二)标记整理 (三)复制 (四ÿ…...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...
华为OD最新机试真题-数组组成的最小数字-OD统一考试(B卷)
题目描述 给定一个整型数组,请从该数组中选择3个元素 组成最小数字并输出 (如果数组长度小于3,则选择数组中所有元素来组成最小数字)。 输入描述 行用半角逗号分割的字符串记录的整型数组,0<数组长度<= 100,0<整数的取值范围<= 10000。 输出描述 由3个元素组成…...
API网关Kong的鉴权与限流:高并发场景下的核心实践
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 引言 在微服务架构中,API网关承担着流量调度、安全防护和协议转换的核心职责。作为云原生时代的代表性网关,Kong凭借其插件化架构…...
高防服务器价格高原因分析
高防服务器的价格较高,主要是由于其特殊的防御机制、硬件配置、运营维护等多方面的综合成本。以下从技术、资源和服务三个维度详细解析高防服务器昂贵的原因: 一、硬件与技术投入 大带宽需求 DDoS攻击通过占用大量带宽资源瘫痪目标服务器,因此…...