十大排序算法详解

目录

1. 冒泡排序

a. 思路

b. code

2. 插入排序

a. 思路

b. code

3. 希尔排序【插入排序plus】

a. 思路

b. code

4. 选择排序

a. 思路

b. code

5. 基数排序

a. 前置知识

b. 思路

c. code

6. 计数排序

a. 思路

b. code

7. 桶排序(计数排序plus & 基于分治)

a. 思路

b. code

8. 归并(基于分治)

a. 思路

b. code

9. 快排(基于分治)

a. 思路

b. code

10. 堆排序(以大顶堆为例)

a. 前置知识

b. 思路

c. code

11. 测试代码


1. 冒泡排序

a. 思路

  1. 外层循环控制次数,用来一次确定 len - 1, len - 2,len - 3, ... ,0 位置的数
  2. 内层循环遍历的过程中比较相邻两个数,将较大的数放置到数组右边

b. code

void bubble_sort(int arr[]) {for (int i = 0; i < len; i++) {for (int j = 0; j < len - i - 1; j ++) {if (arr[j + 1] < arr[j]) {swap(arr, j, j + 1);}}}
}
package bubble_sort;public class Main {/*** @description: 冒泡排序* @param arr* @return void* @date: 2023/7/17 20:25*/private static void bubbleSort(int[] arr) {for (int i = 0; i < arr.length; i++) {for (int j = 0; j < arr.length - i - 1; j ++) {// 比较相邻两个数的大小,将较大的数移动到右边if (arr[j + 1] < arr[j]) {swap(arr, j, j + 1);}}}}
}

2. 插入排序

a. 思路

  1. 默认第一个数有序
  2. 从 index = 1 开始遍历数组,将第 i 个数倒序同之前的数进行比较并插入使得前 i + 1 项有序

b. code

void insert_sort(int arr[]) {for (int i = 1; i < len; i ++) {int key = arr[i];int j = i - 1;while (j >= 0 && arr[j] > key) {arr[j + 1] = arr[j];j --;}arr[j + 1] = key;}
}
package insert_sort;public class Main {/*** @description: 插入排序* @param arr* @return void* @date: 2023/7/17 23:21*/private static void insertSort(int[] arr) {for (int i = 1; i < arr.length; i ++) {int key = arr[i];int j = i - 1;while (j >= 0 && arr[j] > key) {arr[j + 1] = arr[j];j --;}arr[j + 1] = key;}}
}

3. 希尔排序【插入排序plus】

a. 思路

  1. 设置循环增量 gap,迭代 gap /= 2
  2. 每次循环对 【i,i + gap,i + 2 * gap...】(i in [0,gap]进行插入排序

b. code

void shell_sort(int arr[]) {// 初始增量 len / 2, 每次循环后, 增量 /= 2for (int gap = len / 2; gap > 0; gap /= 2) {// 每次采用插入排序for (int i = gap, j; i < len; i ++) {int key = arr[i];for (j = i; j >= gap && key < arr[j - gap]; j -= gap) {arr[j] = arr[j - gap];}arr[j] = key;}}
}
package shell_sort;public class Main {/*** @description: 希尔排序* @param arr* @return void* @date: 2023/7/24 2:20*/private static void shellSort(int[] arr) {// 初始增量 len / 2, 每次循环后, 增量 /= 2for (int gap = arr.length / 2; gap > 0; gap /= 2) {// 每次采用插入排序for (int i = gap, j; i < arr.length; i ++) {int key = arr[i];for (j = i; j >= gap && key < arr[j - gap]; j -= gap) {arr[j] = arr[j - gap];}arr[j] = key;}}}}

4. 选择排序

a. 思路

  1. 外层循环控制当前排序的位置
  2. 内层循环遍历 i + 1 ~ j,查找arr在 i ~ j 上的最小数的索引
  3. 然后将查找到的最小的数与 arr[i] 交换顺序

b. code

void select_sort(int arr[]) {for (int i = 0; i < len; i++) {int minIndex = i;for (int j = i + 1; j < len; j ++) {if (arr[j] < arr[minIndex])minIndex = j;}swap(arr, i, minIndex);}
}
package select_sort;public class Main {/*** @description: 选择排序* @param arr* @return void* @date: 2023/7/20 16:17*/private static void selectSort(int[] arr) {for (int i = 0; i < arr.length; i++) {int minIndex = i;for (int j = i + 1; j < arr.length; j ++) {if (arr[j] < arr[minIndex])minIndex = j;}swap(arr, i, minIndex);}}
}

5. 基数排序

a. 前置知识

队列:Queue| ProcessOn免费在线作图,在线流程图,在线思维导图

b. 思路

  1. 依次按照数组中数的个位、十位……将数放置到不同的桶中(分类)
  2. 将桶中的数赋值回原数组,作为该轮排序后的顺序(收集)

【PS】 : 每次排序都是基于上一轮的排序后的顺序进行,从而确保顺序不会错乱

c. code

#include <queue>// 获取个位数(index = 0), 十位数(index = 1)...上的数
int get_num(int num, int lastIndex);
// 获取最大数的长度, 作为数组的分类次数
int get_cnt(int arr[]);
// 基数排序 
void radix_sort(int arr[]);void radix_sort(int arr[]) {// 1. 找最大值的长度, 确定循环轮次int cnt = get_cnt(arr);// 2. 初始化十个桶queue<int> q[10];// 3.依次按照个位、十位数进行排序for (int i = 0; i < cnt; i++) {// 3.1 分类过程: 将数按照位数放入相应的桶中for (int j = 0; j < len; j ++) {q[get_num(arr[j], i)].push(arr[j]);}// 3.2 收集过程: 将桶中的数依次放入原数组 arr 中for (int j = 0, index = 0; j < 10; j ++) {while (!q[j].empty()) {arr[index ++] = q[j].front();q[j].pop();}}}
}int get_num(int num, int lastIndex) {int res = num;for (int i = 0; i < lastIndex; i ++) {res /= 10;}return res % 10;
}int get_cnt(int arr[]) {int max = arr[0]; for (int i = 1; i < len; i ++) {if (arr[i] > max) {max = arr[i];}}int cnt = 0; while (max > 0) {max /= 10;cnt ++;}return cnt;
}
package radix_sort;import java.util.LinkedList;public class Main {/*** @description: 基数排序* @param arr* @return void* @date: 2023/7/22 9:56*/private static void radixSort(int[] arr) {// 1. 找最大值的长度, 确定循环轮次int cnt = getCnt(arr);// 2. 初始化十个桶LinkedList<Integer>[] list = new LinkedList[10];for (int i = 0; i < list.length; i++) {list[i] = new LinkedList<>();}// 3.依次按照个位、十位数进行排序for (int i = 0; i < cnt; i++) {// 3.1 分类过程: 将数按照位数放入相应的桶中for (int j = 0; j < arr.length; j ++) {list[getNum(arr[j], i)].offer(arr[j]);}// 3.2 收集过程: 将桶中的数依次放入原数组 arr 中for (int j = 0, index = 0; j < list.length; j ++) {while (!list[j].isEmpty()) {arr[index ++] = list[j].poll();}}}}// 获取个位数(index = 0), 十位数(index = 1)...上的数private static int getNum(Integer num, int lastIndex) {return num.toString().length() <= lastIndex ? 0 : num.toString().charAt(num.toString().length() - lastIndex - 1) - '0';}// 获取最大数的长度, 作为数组的分类次数private static int getCnt(int[] arr) {return (Arrays.stream(arr).max().getAsInt() + "").length();}
}

6. 计数排序

a. 思路

  1. 构建临时数组,对 arr 中的数进行次数统计(计数)
  2. 按照统计好的结果给 arr 赋值

b. code

void cnt_sort(int arr[]) {// 1. 获取最大值、最小值int max = arr[0], min = arr[0];for (int i = 1; i < len; i ++) {if (arr[i] > max) {max = arr[i];} if (arr[i] < min) {min = arr[i];}}// 2. 创建临时数组int temp_arr[max - min + 1];for (int i = 0; i < max - min + 1; i ++) {temp_arr[i] = 0;}// 3. 对 arr 进行计数for (int i = 0; i < len; i ++) {temp_arr[arr[i] - min] ++;}// 4. 按照统计结果将数赋值给原始数组 arrfor (int i = 0, index = 0; i < max - min + 1; i ++) {while (temp_arr[i] -- > 0) {arr[index ++] = i + min;}}
}
package count_sort;import java.util.Arrays;public class Main {/*** @description: 计数排序* @param arr* @return void* @date: 2023/7/23 19:28*/private static void cntSort(int[] arr) {// 1. 获取最大值、最小值int max = Arrays.stream(arr).max().getAsInt();int min = Arrays.stream(arr).min().getAsInt();// 2. 创建临时数组int[] tempArr = new int[max - min + 1];// 3. 对 arr 进行计数for (int i = 0; i < arr.length; i ++) {tempArr[arr[i] - min] ++;}// 4. 按照统计结果将数赋值给原始数组 arrfor (int i = 0, index = 0; i < tempArr.length; i ++) {while (tempArr[i] -- > 0) {arr[index++] = i + min;}}}}

7. 桶排序(计数排序plus & 基于分治)

a. 思路

  1. 划分为多个范围相同的区间,每个区间自排序(递归 or 调用别的排序算法)
  2. 将区间合并

【PS】:计数排序可以看成每个桶只存储相同元素,而桶排序每个桶存储一定范围的元素

b. code

#include <vector>
#include<algorithm>void bucket_sort(int arr[]){// 1. 获取最大值、最小值int max = arr[0], min = arr[0];for (int i = 1; i < len; i ++) {if (arr[i] > max) {max = arr[i];} if (arr[i] < min) {min = arr[i];}}// 2. 计算桶的数量并初始化桶集合 int bucketCnt = (max - min) / len + 1;vector<vector<int>> bucketList(bucketCnt);// 3. 将每个元素放入桶for (int i = 0; i < len; i ++) {bucketList[(arr[i] - min) / len].push_back(arr[i]);}// 4. 对每个桶进行排序for (int i = 0; i < bucketList.size(); i ++) {sort(bucketList[i].begin(), bucketList[i].end());}// 5. 将桶中的元素赋值到原序列for (int i = 0, index = 0; i < bucketCnt; i ++) {for (int j = 0; j < bucketList[i].size(); j ++) {arr[index ++] = bucketList[i][j];}}
}
package bucket_sort;import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;public class Main {/*** @description: 桶排序* @param arr* @return void* @date: 2023/7/24 0:48*/public static void bucketSort(int[] arr){// 1. 计算最大值、最小值int max = Arrays.stream(arr).max().getAsInt();int min = Arrays.stream(arr).min().getAsInt();// 2. 计算桶的数量并初始化桶int bucketCnt = (max - min) / arr.length + 1;List<ArrayList<Integer>> bucketList = new ArrayList<ArrayList<Integer>>(){{for(int i = 0; i < bucketCnt; i++){add(new ArrayList<>());}}};// 3. 将每个元素放入桶Arrays.stream(arr).forEach(i -> bucketList.get((i - min) / arr.length).add(i));// 4. 对每个桶进行排序bucketList.forEach(Collections::sort);// 5. 将桶中的元素赋值到原序列AtomicInteger index = new AtomicInteger();bucketList.forEach(bucket -> bucket.forEach(i -> arr[index.getAndIncrement()] = i));}
}

8. 归并(基于分治)

a. 思路

  1. 确定分界点:mid =(l + r)/ 2
  2. 递归排序 left & right
  3. 归并,合二为一

【PS】:先递归处理,后合二为一

b. code

// 归并用的合并辅助数组 
int temp_arr[N];// 归并排序 
void merge_sort(int arr[], int l, int r) {if (l >= r) {return;}// 递归int mid = l + ((r - l) >> 1);merge_sort(arr, l, mid);merge_sort(arr, mid + 1, r);// 合并int index = l, i = l, j = mid + 1;while (i <= mid && j <= r) {temp_arr[index ++] = arr[i] < arr[j] ? arr[i ++] : arr[j ++];} while (i <= mid) temp_arr[index ++] = arr[i ++];while (j <= r) temp_arr[index ++] = arr[j ++];// 从排好序的数从临时数组放入到原数组for (int temp_index = l; temp_index <= r; temp_index ++) {arr[temp_index] = temp_arr[temp_index];}}
package merge_sort;public class Main {private static int[] tempArr = new int[MAX_LEN];/*** @description: 归并排序* @param arr* @param l 左边界* @param r 右边界* @return void* @date: 2023/6/6 10:57*/private static void mergeSort(int[] arr, int l, int r) {if (l >= r) {return;}int mid = l + ((r - l) >> 1);mergeSort(arr, l, mid);mergeSort(arr, mid + 1, r);int index = l, i = l, j = mid + 1;while (i <= mid && j <= r) {tempArr[index ++] = arr[i] <= arr[j] ? arr[i ++] : arr[j ++];}while (i <= mid) tempArr[index ++] = arr[i ++];while (j <= r) tempArr[index ++] = arr[j ++];for (int tempIndex = l; tempIndex <= r; tempIndex ++) {arr[tempIndex] = tempArr[tempIndex];}}
}

9. 快排(基于分治)

a. 思路

  1. 确定基准点 x = arr[l] or arr[(l + r) / 2] or arr[r] or 随机)
  2. 调整区间为:左边 <= 基准 x,右边 >= 基准 x
  3. 递归处理左右两段

【PS】:先划分边界,后递归处理

b. code

void quick_sort(int arr[], int l, int r) { if (l >= r) {return;}// i, j 指向 l, r 的两侧, 因为 while 那儿使用 ++i 这种格式 int x = arr[l], i = l - 1, j = r + 1;while (i < j) {// 找左右两侧需要需要交换位置的点while (arr[++ i] < x);while (arr[-- j] > x);// 交换位置if (i < j)  swap(arr, i, j);} // 递归: 这儿按 j 来写, 避免出现边界问题 quick_sort(arr, l, j);quick_sort(arr, j + 1, r);
}
package quick_sort;public class Main {/*** @description: 快排* @param arr 排序数组* @param l 左边界* @param r 右边界* @return void* @date: 2023/6/6 4:54*/private static void quickSort(int[] arr, int l, int r) {if (l >= r) {return;}int x = arr[l], i = l - 1, j = r + 1;while (i < j) {while (arr[++ i] < x);while (arr[-- j] > x);if (i < j) swap(arr, i, j);}quickSort(arr, l, j);quickSort(arr, j + 1, r);}private static void swap(int[] arr, int i, int j) {int temp = arr[i];arr[i] = arr[j];arr[j] = temp;}}

10. 堆排序(以大顶堆为例)

a. 前置知识

大顶堆:父节点 > 左孩子 && 父节点 > 右孩子

b. 思路

  1. 基于原数组初始化大顶堆
  2. 将大顶堆的堆首堆尾交换位置,从而使堆尾之后的子数组有序
  3. 将堆的大小 - 1(1:刚刚交换的堆顶数,位置已确定),重新维护新的大顶堆

c. code

void heap_sort(int arr[]) {// 1. 构建大顶堆(从第一个有孩子节点的地方开始维护)for (int i = len / 2 - 1; i >= 0; -- i) {heapify(arr, i, len);}// 2. 排序for (int i = len - 1; i >= 1; -- i) {// 把大顶堆的堆顶元素与最后一个元素交换swap(arr, 0, i);// 对打乱的堆进行调整,恢复堆的特性heapify(arr, 0, i);}
}void heapify(int arr[], int oldParent, int i) {// 1. 初始化父子节点索引int newParent = oldParent;int leftChild = 2 * oldParent + 1;int rightChild = 2 * oldParent + 2;// 2. 判断构建好后父节点应该在的位置 newParentif (leftChild < i && arr[newParent] < arr[leftChild]) newParent = leftChild;if (rightChild < i && arr[newParent] < arr[rightChild]) newParent = rightChild;// 3. 父节点更新的情况if (newParent != oldParent) {// 3.1 更新数组, swap(arr, newParent, oldParent);// 3.2 维护交换后的子堆heapify(arr, newParent, i);}
}
package heap_sort;public class Main {/*** @description: 堆排序* @param arr* @return void* @date: 2023/7/24 1:29*/private static void heapSort(int[] arr) {// 1. 构建大顶堆(从第一个有孩子节点的地方开始维护)for (int i = arr.length / 2 - 1; i >= 0; -- i) {heapify(arr, i, arr.length);}// 2. 排序for (int len = arr.length - 1; len >= 1; -- len) {// 把大顶堆的堆顶元素与最后一个元素交换swap(arr, 0, len);// 对打乱的堆进行调整,恢复堆的特性heapify(arr, 0, len);}}/*** @description: 维护大顶堆的性质* @param arr* @param oldParent 原父节点坐标* @param len 需要构建的堆数组的长度* @return void* @date: 2023/7/24 1:50*/private static void heapify(int[] arr, int oldParent, int len) {// 1. 初始化父子节点索引int newParent = oldParent;int leftChild = 2 * oldParent + 1;int rightChild = 2 * oldParent + 2;// 2. 判断构建好后父节点应该在的位置 newParentif (leftChild < len && arr[newParent] < arr[leftChild]) newParent = leftChild;if (rightChild < len && arr[newParent] < arr[rightChild]) newParent = rightChild;// 3. 父节点更新的情况if (newParent != oldParent) {// 3.1 更新数组, swap(arr, newParent, oldParent);// 3.2 维护交换后的子堆heapify(arr, newParent, len);}}
}

11. 测试代码

#include <iostream>
#include <cstdlib>using namespace std;const int N = 100;// 排序数组 
int arr[N];
// 数组长度 
int len;void swap(int arr[], int i, int j) {int temp = arr[i];arr[i] = arr[j];arr[j] = temp;
}int main() {len = rand() % N;printf("arr: "); for (int i = 0; i < len; i ++) {arr[i] = rand() % N;printf("%d\t", arr[i]);}printf("\n"); // ------------排序方法-----------xxx_sort(arr, 0, len - 1);// ------------------------------printf("arr: "); for (int i = 0; i < len; i ++) {printf("%d\t", arr[i]);}return 0;
}
import java.util.Arrays;public class Main {private static int MAX_LEN = 1000;private static int MAX_VALUE = 1000;private static int[] tempArr = new int[MAX_LEN];public static void main(String[] args) {int[] arr = new int[(int) (Math.random() * MAX_LEN + 1)];for (int i = 0; i < arr.length; i++) {arr[i] = (int) (Math.random() * MAX_VALUE + 1);}System.out.println("arr: ");System.out.println(Arrays.toString(arr));// ------------排序方法-----------xxxSort(arr, 0, arr.length - 1);// ------------------------------System.out.println("arr: ");System.out.println(Arrays.toString(arr));}private static void swap(int[] arr, int i, int j) {int temp = arr[i];arr[i] = arr[j];arr[j] = temp;}
}

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

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

相关文章

Could not resolve placeholder

本质原因&#xff1a;项目启动未扫描到该配置&#xff0c;一般来说是配置不对 检查方向 1、检查编译后的target包里是否有该配置所在的文件 如果不在就clear&#xff0c;重新编译启动再去检查 2、检查启动的环境是否匹配 编译后的target包下的配置文件名称是否跟启动类的环境…

【如何训练一个中译英翻译器】LSTM机器翻译模型部署之ncnn(python)(四)

ncnn&#xff1a;https://github.com/Tencent/ncnn 1、.h5模型保存为TFSaveModel格式 import tensorflow as tf from keras.models import load_model# 加载Keras模型 model load_model(encoder_model.h5)# 转换为SavedModel类型 tf.saved_model.save(model, TFSaveModel)2、…

redis的常用命令和数据结构

目录 redis的基本特征 Redis操作命令行 redis的数据结构 Redis的基本特征 键值型&#xff0c;value支持多种不同的数据结构&#xff0c;功能丰富 单线程&#xff0c;每个命令具备原子性 低延迟&#xff0c;速快&#xff08;基于内存&#xff0c;IO多路复用&#xff0c;良好…

【OpenCV】windows环境下,java OpenCV环境搭建,java 也可以实现opencv的功能了!opencv自由了

目录 1. 下载opencv 2. 安装opencv 目录 1. 下载opencv 2. 安装opencv 3. dll文件的导入配置 dll文件的导入&#xff1a; &#xff08;C的类库文件&#xff09;&#xff0c;opencv是c开发的类库&#xff0c;java语言要调用其中的方法&#xff0c;所以依赖了dll文件 3.1…

R语言机器学习之影像组学分析的原理详解

概要 影像组学从常规医学图像中高通量提取大量的放射学定量数据&#xff0c;并以非侵入性方式探索它们与临床结果的相关性&#xff0c;在医学研究中得到广泛的应用。 01 影像组学&#xff08;Radiomics&#xff09;的概念&#xff1a; 影像组学&#xff08;Radiomics&#xff…

了解Unity编辑器之组件篇UI(一)

UI组件&#xff1a;提供了用户交互&#xff0c;信息展示&#xff0c;用户导航等功能 一、Button&#xff1a;用于响应用户的点击事件 1.Interactable&#xff08;可交互&#xff09;&#xff1a;该属性控制按钮是否可以与用户交互&#xff0c;如果禁用则按钮无法被点击。可以通…

Ubuntu18.04配置PX4开发环境

源文件下载 读者可以参考PX4中文维基百科&#xff0c;或者使用下面命令↓ git clone https://github.com/PX4/PX4-Autopilot.git --recursive 下载完成之后&#xff0c;执行脚本安装命令&#xff0c;PX4给我们提供了脚本安装模式 bash ./PX4-Autopilot/Tools/setup/ubuntu.sh …

Spring Boot-3

学习笔记&#xff08;今天又读了好多篇的博客&#xff0c;做个今天的总结&#xff0c;加油&#xff01;&#xff01;&#xff01;&#xff09; PS&#xff1a;快到中伏了&#xff0c;今天还是好热 使用阿里巴巴 FastJson 的设置 1、jackson 和 fastJson 的对比 有很多人已经…

Linux 网络收包流程

哈喽大家好&#xff0c;我是咸鱼 我们在跟别人网上聊天的时候&#xff0c;有没有想过你发送的信息是怎么传到对方的电脑上的 又或者我们在上网冲浪的时候&#xff0c;有没有想过 HTML 页面是怎么显示在我们的电脑屏幕上的 无论是我们跟别人聊天还是上网冲浪&#xff0c;其实…

Python绘制多条y轴范围不同的曲线并在一张图上显示

如何使用Python绘制多条y轴范围不同的曲线&#xff0c;然后把它们合并在一张图上显示 import matplotlib.pyplot as plt import numpy as npdef multilines(target, x, ys, types, colors, x_label, labels):"""用来绘制多条y轴范围不同的线&#xff0c;并在一…

苹果iOS 16.6 RC发布:或为iPhone X/8系列养老版本

今天苹果向iPhone用户推送了iOS 16.6 RC更新(内部版本号&#xff1a;20G75)&#xff0c;这是时隔两个月的首次更新。 按照惯例RC版基本不会有什么问题&#xff0c;会在最近一段时间内直接变成正式版&#xff0c;向所有用户推送。 需要注意的是&#xff0c;鉴于iOS 17正式版即将…

Python获取接口数据

首先我们需要下载python&#xff0c;我下载的是官方最新的版本 3.8.3 其次我们需要一个运行Python的环境&#xff0c;我用的是pychram&#xff0c;需要库的话我们可以直接在setting里面安装 代码&#xff1a; # -*- codeing utf-8 -*- from bs4 import BeautifulSoup # 网页…

docker中搭建lnmp

目录 一&#xff1a;项目环境 1、主机ip需求 2、 任务需求 二&#xff1a;多级构建Dockerfile实验部署 lnmp 1、先部署一个有所有依赖包的镜像 2、搭建nginx 3、搭建mysql 4、搭建php 三&#xff1a;一级构建安装lnmp 1、构建自定义docker网络 2、构建nginx容器&#x…

Java版Spring Cloud+Spring Boot+Mybatis+uniapp知识付费平台讲解

提供私有化部署&#xff0c;免费售后&#xff0c;专业技术指导&#xff0c;支持PC、APP、H5、小程序多终端同步&#xff0c;支持二次开发定制&#xff0c;源码交付。 Java版知识付费-轻松拥有知识付费平台 多种直播形式&#xff0c;全面满足直播场景需求 公开课、小班课、独…

降压电路原理 12V电源是如何下降到5V?

引言&#xff1a; 12V-5V开关电源设计原理&#xff1a;以12V电压作为输入&#xff0c;通过控制开关电路的通断时间&#xff0c;实现电感的充放电时间&#xff0c;改变输出电压的平均值&#xff0c;然后进行LC滤波&#xff0c;对输出电压进行电压和电流反馈控制&#xff0c;使其…

企业知识管理系统安全是重中之重

企业开展知识管理工作的益处是全方位的&#xff0c;效果能从业务的各方面得到体现&#xff0c;最终效果就是企业竞争力的提升与企业经营业绩的提升。 知识管理系统的意义在于&#xff0c;构建系统的知识库&#xff0c;对纷杂的知识内容&#xff08;方案、策划、制度等&#xf…

MybatisPlus使用排序查询时,将null值放到最后

1用户需求 查询结果&#xff0c;按照某些字段进行排序&#xff0c;将为null的值放到最后。按照更新时间排序&#xff0c;但是更新时间可能为null&#xff0c;因此将null的数据放到最后。 2解决方案 最简单的方式&#xff0c;当然是下面这种直接在SQL最后面 NULLS LAST &…

502 Bad GateWay报错的解决方法

什么是502 bad gateway 报错 简单来说 502 是报错类型代码 bad gateway 错误的网关。是Web服务器作为网关或代理服务器时收到无效的响应。 用我们的口语说就是运行网站的服务器暂时挂了(不响应)。 产生错误的原因 1.连接超时 我们向服务器发送请求 由于服务器当前链接太多&am…

89、简述RabbitMQ的架构设计

简述RabbitMQ的架构设计 BrokerQueueExchangeRoutingKeyBinding信道架构设计图 Broker RabbitMQ的服务节点 Queue 队列&#xff0c;是RabbitMQ的内部对象&#xff0c;用于存储消息。RabbitMQ中消息只能存储在队列中。生产者投递消息到队列&#xff0c;消费者从队列中获取消息…

科技与人元宇宙论坛跨界对话

近来&#xff0c;“元宇宙”成为热门话题&#xff0c;越来越频繁地出现在人们的视野里。大家都在谈论它&#xff0c;但似 乎还没有一个被所有人认同的定义。元宇宙究竟是什么&#xff1f;未来它会对我们的工作和生活带来什么样 的改变&#xff1f;当谈论虚拟现实&#xff08;VR…