十大排序算法详解

目录

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、…

Linux--assert函数在debug和release下的区别

在debug模式下断言才有效&#xff0c;而在release版本下&#xff0c;断言就无效了 在debug模式下&#xff0c;assert函数用于检查条件是否为真&#xff0c;如果条件为假&#xff0c;则会输出相应的错误信息&#xff0c;并停止程序执行。而在release模式下&#xff0c;assert函数…

redis的常用命令和数据结构

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

无涯教程-jQuery - html( val )方法函数

html(val)方法设置每个匹配元素的html内容。此属性在XML文档上不可用。 html( val ) - 语法 selector.html( val ) 这是此方法使用的所有参数的描述- val - 这是要设置的html内容。 html( val ) - 示例 以下是一个简单的示例&#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…

前端框架学习-Vue(一)

Vue简介 百度百科上关于vue的词条&#xff0c;说vue时一款渐进式JavaScript框架&#xff0c; 简单来说,渐进式是一种设计理念,即在不失去当前功能的前提下,逐步添加新的特性。 说明它时一直在进行维护的。 Vue3&#xff0c;中使用*.vue作为文件后缀&#xff0c;html&#xff0c…

解决安装依赖时报错:npm ERR! code ERESOLVE

系列文章目录 文章目录 系列文章目录前言一、错误原因二、解决方法三、注意事项总结 前言 在使用 npm 安装项目依赖时&#xff0c;有时会遇到错误信息 “npm ERR! code ERESOLVE”&#xff0c;该错误通常发生在依赖版本冲突或者依赖解析问题时。本文将详细介绍出现这个错误的原…

git指定tag只拉取某个release版本代码,节约贷款

采用-b指定tag&#xff0c;--depth1指定只拉取最后一个版本的代码&#xff0c;日志如下 yeqiangyeqiang-MS-7B23:~/Downloads/src$ git clone --depth1 -b 7cbf1a2 https://github.com/llvm/llvm-project 正克隆到 llvm-project... warning: 不能发现要克隆的远程分支 7cbf1a2…

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

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

React Context(上下文)

1 Context Context 通过组件树提供了一个数据传递的方法&#xff0c;从而避免了在每一个层级手动传递props属性。 有部分小伙伴应该使用props属性进行组件上下传值的操作。当多个组件嵌套的时候&#xff0c;就需要慢慢向上寻找最初的值是什么。 2 API React.createContext:…

Jmeter之Beanshell解析并提取json响应

1&#xff1a;前置条件 将fastjson-1.2.49.jar包置于jmeter的lib目录下&#xff0c;并将该jar包添加到测试计划的Library中&#xff1b;否则会报&#xff1a;Typed variable declaration : Class: JSONObject not found in namespace的错误 2&#xff1a;解析思路 利用beansh…

了解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;并在一…

代码随想录 DAY28 93.复原IP地址 78.子集 90.子集II

93.复原IP地址 切割字符串&#xff0c;并且在每一个切割过的字符串后面加上 ‘ .’ 返回条件&#xff1a;逗点个数3 如果最后一小节符合要求&#xff0c;就将该字符串添加到结果集中 循环中&#xff1a;从start到i 符合要求&#xff0c;就继续添加逗点和字符 不符合下面就不用…

数学建模的六个步骤

一、模型准备 了解问题的实际背景&#xff0c;明确其实际意义&#xff0c;掌握对象的各种信息&#xff0c;以数学思路来解释问题的精髓&#xff0c;数学思路贯彻问题的全过程&#xff0c;进而用数学语言来描述问题。要求符合数学理论&#xff0c;符合数学习惯&#xff0c;清晰…

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

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