十种基础排序算法(C语言实现,带源码)(有具体排序例子,适合学习理解)
学习了十种常见的排序方法,此文章针对所学的排序方法进行整理(通过C语言完成排序)。
参考内容:
https://blog.csdn.net/mwj327720862/article/details/80498455
https://www.runoob.com/w3cnote/ten-sorting-algorithm.html
1. 冒泡排序(Bubble Sort)
冒泡排序是一种简单的排序算法,属于交换排序的一种。通过重复遍历待排序的列表,依次比较相邻的两个元素并根据大小进行交换。
- 从左到右依次比较相邻的两个元素,如果前面的元素大于后面的元素,就交换它们的位置。
- 重复此过程,将最大(或最小)的元素移动到当前未排序部分的末尾。
- 对未排序部分重复上述步骤,直到所有元素都排好序。
时间复杂度(平均): O ( n 2 ) O(n^2) O(n2)
空间复杂度: O ( 1 ) O(1) O(1)
如图中数组排序,用了5轮成功排好序,但实际运行了8轮(不判断数组已经有序的情况下),以下是排序实现代码。
#include <stdio.h>int bubbleSort(int arr[],int size)
{for(int i = 0; i < size - 1; i++){for(int j = 0; j <size - i - 1;j++){if(arr[j] > arr[j + 1]){int temp = arr[j];arr[j] = arr[j+1];arr[j+1] = temp;}}}
}void printArr(int arr[], int size)
{for(int i = 0; i < size; i++){printf("%-5d",arr[i]);}printf("\n");
}int main(int argc,char *argv[])
{int arr[] = {1,3,7,5,4,6,2,9,8};int size = sizeof(arr) / sizeof(arr[0]);printArr(arr,size);bubbleSort(arr,size);printArr(arr,size);return 0;
}
2. 选择排序(Selection Sort)
选择排序是一种简单排序算法,它的基本思想是通过多次选择,将没排序部分中的最小(或最大)元素找到,将其放在已排序部分的末尾(或开头)。
- 从未排序部分中找到最小(或最大)的元素。
- 将该元素与未排序部分的第一个元素交换,完成一轮排序。
- 将剩余未排序部分重复上述步骤,直到所有元素都排序完成。
时间复杂度(平均): O ( n 2 ) O(n^2) O(n2)
空间复杂度: O ( 1 ) O(1) O(1)
#include <stdio.h>int selectSort(int arr[],int size)
{int i,j,k;for(i = 0; i < size - 1; i++){k = i;for(j = i + 1; j < size; j++){if(arr[k] > arr[j])k = j;}int temp = arr[k];arr[k] = arr[i];arr[i] = temp;}
}int printArr(int arr[],int size)
{for(int i = 0; i < size; i++){printf("%-5d",arr[i]);}printf("\n");
}int main(int argc,char *argv[])
{int arr[] = {1,3,7,5,4,6,2,9,8};int size = sizeof(arr) / sizeof(arr[0]);printArr(arr,size);selectSort(arr,size);printArr(arr,size);return 0;
}
3. 插入排序(Insert Sort)
插入排序是一种简单的排序算法,它的基本思想是:将待排序的数组划分为已排序部分和未排序部分,每次从未排序部分取出一个元素,插入到已排序部分的合适位置,直到整个数组变得有序。
- 从第二个元素开始,依次将未排序部分的元素插入到已排序部分的合适位置,使已排序部分始终有序。
- 重复上述步骤,直到所有元素都排好序。
时间复杂度(平均): O ( n 2 ) O(n^2) O(n2)
空间复杂度: O ( 1 ) O(1) O(1)
#include <stdio.h>int insertSort(int arr[],int size)
{int i,j;for( i = 1; i < size; i++){int temp = arr[i];for(j = i; j > 0 && arr[j - 1] > temp; j--){arr[j] = arr[j - 1]; }arr[j] = temp;}
}void printArr(int arr[], int size)
{for(int i = 0; i < size; i++)printf("%-5d",arr[i]);printf("\n");
}int main(int argc,char *argv[])
{int arr[] = {1,3,7,5,4,6,2,9,8};int size = sizeof(arr) / sizeof(arr[0]);printArr(arr,size);insertSort(arr,size);printArr(arr,size);return 0;
}
4. 希尔排序(Shell Sort)
希尔排序是一种基于插入排序的高级排序算法,它的基本思想是通过逐步减少数据的间隔(gap),将数据分组并排序,从而逐步逼近整体有序;它的核心思想是分组插入排序,通过对数据进行预排序以减少逆序对,从而优化了插入排序的效率。
- 将数组分成多个间隔为gap的子序列(每隔gap个元素视为一个分组)。
- 对每个子序列进行插入排序,使子序列内局部有序。
- 减小gap值,重复步骤 1 和 2,直到gap=1,此时对整个数组进行最后一次插入排序。
- 最终数组完全有序
时间复杂度(平均):介于 O ( n l o g n ) O(nlog n) O(nlogn)和 O ( n 2 ) O(n^2) O(n2)之间
空间复杂度: O ( 1 ) O(1) O(1)
#include <stdio.h>int shellSort(int arr[],int size)
{int i,j,temp,increment;for(increment = size / 2; increment > 0; increment /= 2){for(i = increment; i < size; i++){temp = arr[i];for(j = i - increment; j >= 0 && arr[j] > temp; j -= increment){arr[j + increment] = arr[j];}arr[j + increment] = temp;}}
}void printArr(int arr[],int size)
{for(int i = 0; i < size; i++)printf("%-5d",arr[i]);printf("\n");}int main(int argc,char *argv[])
{int arr[] = {1,3,7,5,4,6,2,9,8};int size = sizeof(arr) / sizeof(arr[0]);printArr(arr,size);shellSort(arr,size);printArr(arr,size);return 0;
}
5. 归并排序(Merge Sort)
归并排序是一种分治算法,它通过将数组不断拆分成更小的子数组进行排序,并将排序后的子数组合并成一个有序的数组。它的主要思想是分而治之:
- 分解:将数组递归地分成两半,直到每个子数组只有一个元素或为空。
- 合并:将两个有序的子数组合并成一个更大的有序数组。
- 将数组从中间拆分成两个子数组。
- 递归地对左右两个子数组进行归并排序。
- 合并两个有序子数组,使整个数组有序。
时间复杂度(平均): O ( n l o g n ) O(nlogn) O(nlogn)
空间复杂度: O ( n ) O(n) O(n)(需要额外数组存储合并结果)
#include <stdio.h>
#include <stdlib.h>void merge(int arr[], int left, int mid, int right)
{int n1 = mid - left + 1;int n2 = right - mid;int *L = (int *)malloc(n1 * sizeof(int));int *R = (int *)malloc(n2 * sizeof(int));for(int i = 0; i < n1; i++)L[i] = arr[left + i];for(int i = 0; i < n2; i++)R[i] = arr[mid +i + 1];int i = 0, j = 0, k = left;while(i < n1 && j < n2){if(L[i] <= R[j]){arr[k] = L[i];i++;}else{arr[k] = R[j];j++;}k++;}while(i < n1){arr[k] = L[i];i++;k++;}while(j < n2){arr[k] = R[j];j++;k++;}free(L);free(R);
} void mergeSort(int arr[], int left, int right)
{if(left < right){int mid = left + (right - left) / 2;mergeSort(arr,left,mid);mergeSort(arr,mid+1,right);merge(arr,left,mid,right);}
}void printArr(int arr[],int size)
{for(int i = 0; i < size; i++){printf("%-5d",arr[i]);}printf("\n");
}int main(int argc,char *argv[])
{int arr[] = {1,3,7,5,4,6,2,9,8};int size = sizeof(arr) / sizeof(arr[0]);printArr(arr,size);mergeSort(arr,0,size - 1);printArr(arr,size);return 0;
}
6. 快速排序(Quick Sort)
快速排序是一种基于分治思想的高效排序算法。它通过选择一个基准值,将数组划分为两个部分:小于基准值的元素和大于基准值的元素,然后递归地对这两部分进行排序。
- 选择基准值:从数组中选择一个基准值(通常是第一个元素、最后一个元素或者任意元素)
- 分区:将数组重新排序,使所有小于基准值的元素位于基准值左侧,大于基准值的元素位于右侧
- 递归排序:对基准值两侧的子数组继续递归快速排序
- 重复上述步骤,直到有序
时间复杂度(平均): O ( n l o g n ) O(nlogn) O(nlogn)
空间复杂度: O ( l o g n ) O(logn) O(logn)(递归栈空间)
#include <stdio.h>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;
}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);}
}void printArr(int arr[],int size)
{for(int i = 0; i < size; i++)printf("%-5d",arr[i]);printf("\n");
}int main(int argc,char *argv[])
{int arr[] = {1,3,7,5,4,6,2,9,8};int size = sizeof(arr) / sizeof(arr[0]);printArr(arr,size);quickSort(arr,0,size-1);printArr(arr,size);return 0;
}
7. 堆排序(Heap Sort)
堆排序是一种基于堆结构的比较排序算法。堆是一颗完全二叉树,并且满足堆性质:
- 大顶堆:每个节点的值都大于或等于其左右子节点的值。
- 小顶堆:每个节点的值都小于或等于其左右子节点的值。
堆排序利用大顶堆的特性来实现升序排序(或小顶堆实现降序排序)(此处实现升序排序)
- 构建初始堆:将数组是为完全二叉树,并调整其为大顶堆。
- 交换堆顶和堆尾:堆顶元素是最大值,与最后一个元素交换,将最大值移到最终位置。
- 调整堆:交换后,重新调整为大顶堆。
- 重复步骤2、3。直到堆中只有一个元素
时间复杂度(平均): O ( n l o g n ) O(nlogn) O(nlogn)
空间复杂度: O ( 1 ) O(1) O(1)
#include <stdio.h>void heapify(int arr[],int n,int i)
{int lastest = i;int left = 2 * i + 1;int right = 2 * i + 2;if(left < n && arr[left] > arr[lastest]){lastest = left;}if(right < n && arr[right] > arr[lastest]){lastest = right;}if(lastest != i){int temp = arr[lastest];arr[lastest] = arr[i];arr[i] = temp;heapify(arr,n,lastest);}
}void heapSort(int arr[],int n)
{for(int i = n / 2 - 1; i >= 0; i--){heapify(arr,n,i);}for(int i = n - 1; i >= 0;){int temp = arr[i];arr[i] = arr[0];arr[0] = temp;i--;heapify(arr,i,0);}
}void printArr(int arr[],int size)
{for(int i = 0; i < size; i++){printf("%-5d",arr[i]);}printf("\n");
}int main(int argc,char *argv[])
{int arr[] = {1,3,7,5,4,6,2,9,8};int size = sizeof(arr) / sizeof(arr[0]);printArr(arr,size);heapSort(arr,size);printArr(arr,size);return 0;
}
8. 计数排序(Counting Sort)
计数排序是一种非比较排序算法,适用于对整数或范围有限的离散数据进行排序。它通过统计每个元素出现的次数来确定元素在排序后的位置。它的核心思想是:
- 统计每个元素的出现次数
- 利用这些计数信息计算元素的位置索引
- 根据索引将元素放入正确的位置,从而完成排序
计算频率:
找到数组中最大值和最小值,确定数值范围
创建一个计数数组,记录每个值在原数组中出现次数
累积计数:
将计数数组转换为累积计数数组,表示每个值在排序后的位置范围
- 填充结果:
倒叙遍历原数组,根据累积计数数组将元素放到结果数组中,并更新计数数组
时间复杂度: O ( n + k ) O(n+k) O(n+k):n是数组大小,k是数据范围
空间复杂度: O ( n + k ) O(n+k) O(n+k):需要额外计数数组和结果数组
#include <stdio.h>
#include <stdlib.h>void countSort(int arr[],int size)
{int max = arr[0],min = arr[0];for(int i = 0; i < size; i++){if(arr[i] > max)max = arr[i];if(arr[i] < min)min = arr[i];}int len = max - min + 1;int *count = (int *)calloc(len,sizeof(int));for(int i = 0; i < size; i++){count[arr[i]-min]++;}for(int i = 1; i < len; i++){count[i] += count[i-1];}int *output = (int *)calloc(size,sizeof(int));for(int i = size - 1; i >= 0; i--){output[count[arr[i]-min]-1] = arr[i];}for(int i = 0; i < size; i++){arr[i] = output[i];}free(count);free(output);
}void printArr(int arr[],int size)
{for(int i = 0;i < size; i++)printf("%-5d",arr[i]);printf("\n");
}int main(int argc,char *argv[])
{int arr[] = {57, 31, 67, 89, 4, 12, 5, 54, 32, 63};int size = sizeof(arr) / sizeof(arr[0]);printArr(arr,size);countSort(arr,size);printArr(arr,size);return 0;
}
9. 桶排序(Bucket Sort)
桶排序是一种基于分布的排序算法,它通过将数据分配到多个桶中,然后分别对每个桶中的数据进行排序,最后合并所有桶中的数据来完成排序。适用于输入数据分布均匀的情况,特别是当数据范围有限且可以被分成多个区间时,效率较高。
- 分桶:根据数据范围,将数据分配到多个桶中,每个桶对应一个区间
- 桶内排序:对每个桶中的数据分别进行排序(推荐插入排序)
- 合并桶:依次合并每个桶中的数据
时间复杂度(平均): O ( n + k + n l o g ( n / k ) ) O(n+k+nlog(n/k)) O(n+k+nlog(n/k))
空间复杂度: O ( n + k ) O(n+k) O(n+k)
#include <stdio.h>
#include <stdlib.h>// 链表节点
typedef struct Node {int data;struct Node* next;
} Node;// 创建新节点
Node* createNode(int data) {Node* newNode = (Node*)malloc(sizeof(Node));newNode->data = data;newNode->next = NULL;return newNode;
}// 在链表中插入节点并保持排序顺序
void sortedInsert(Node** head, int data) {Node* newNode = createNode(data);if (*head == NULL || (*head)->data >= data) {newNode->next = *head;*head = newNode;} else {Node* current = *head;while (current->next != NULL && current->next->data < data) {current = current->next;}newNode->next = current->next;current->next = newNode;}
}// 桶排序函数
void bucketSort(int arr[], int size) {if (size <= 0) return;// 找到数组中的最大值和最小值int max = arr[0], min = arr[0];for (int i = 1; i < size; i++) {if (arr[i] > max) max = arr[i];if (arr[i] < min) min = arr[i];}int bucketCount = 5; // 假设有5个桶int range = (max - min + bucketCount) / bucketCount; // 每个桶存储的整数范围Node** buckets = (Node**)malloc(bucketCount * sizeof(Node*));for (int i = 0; i < bucketCount; i++) {buckets[i] = NULL;}// 将元素分配到对应的桶for (int i = 0; i < size; i++) {int bucketIndex = (arr[i] - min) / range;sortedInsert(&buckets[bucketIndex], arr[i]);}// 将桶内的元素合并回原数组int index = 0;for (int i = 0; i < bucketCount; i++) {Node* current = buckets[i];while (current != NULL) {arr[index++] = current->data;Node* temp = current;current = current->next;free(temp); // 释放链表节点}}free(buckets); // 释放桶数组
}void printArr(int arr[], int size) {for (int i = 0; i < size; i++) printf("%-5d", arr[i]);printf("\n");
}int main() {int arr[] = {21, 33, 17, 5, 44, 26, 32, 19, 38};int size = sizeof(arr) / sizeof(arr[0]);printArr(arr, size);bucketSort(arr, size);printArr(arr, size);return 0;
}
10.基数排序(Radix Sort)
基数排序是一种非比较排序算法,通过按位对数据进行多轮排序来实现。它是一种稳定的排序算法,适用于整数或字符串等离散数据的排序。基数排序的核心思想是将数据拆分为多个位,按照位的优先级(从低位到高位或从高位到低位)依次进行排序。
确定最大位数:找到数组中元素的最大数,决定排序的轮数
按位排序:
从最低为开始,对每一位进行排序
使用稳定的排序算法(如计数排序)对当前位上的数字进行排序
完成排序:
重复2,直到最高位
时间复杂度: O ( d ∗ ( n + k ) ) O(d*(n+k)) O(d∗(n+k)),其中d是位数,n是数据大小,k是基数
空间复杂度: O ( n + k ) O(n+k) O(n+k)
#include <stdio.h>
#include <stdlib.h>// 使用计数排序对数组的某一位进行排序
void countSort(int arr[], int size, int exp) {int output[size]; // 输出数组int count[10] = {0}; // 计数数组// 统计当前位数字的频率for (int i = 0; i < size; i++) {int digit = (arr[i] / exp) % 10;count[digit]++;}// 计算累积频率for (int i = 1; i < 10; i++) {count[i] += count[i - 1];}// 按当前位数字将元素放入输出数组for (int i = size - 1; i >= 0; i--) {int digit = (arr[i] / exp) % 10;output[count[digit] - 1] = arr[i];count[digit]--;}// 将排序结果复制回原数组for (int i = 0; i < size; i++) {arr[i] = output[i];}
}// 基数排序主函数
void radixSort(int arr[], int size) {// 找到最大值,确定最高位int max = arr[0];for (int i = 1; i < size; i++) {if (arr[i] > max) {max = arr[i];}}// 从个位开始,对每一位进行排序for (int exp = 1; max / exp > 0; exp *= 10) {countSort(arr, size, exp);}
}void printArr(int arr[], int size) {for (int i = 0; i < size; i++) printf("%-5d", arr[i]);printf("\n");
}int main() {int arr[] = {1705, 43, 76, 90, 802, 24, 2, 66, 635};int size = sizeof(arr) / sizeof(arr[0]);printArr(arr, size);radixSort(arr, size);printArr(arr, size);return 0;
}
相关文章:

十种基础排序算法(C语言实现,带源码)(有具体排序例子,适合学习理解)
学习了十种常见的排序方法,此文章针对所学的排序方法进行整理(通过C语言完成排序)。 参考内容: https://blog.csdn.net/mwj327720862/article/details/80498455 https://www.runoob.com/w3cnote/ten-sorting-algorithm.html 1. 冒…...

基于fMRI数据计算脑脊液(CSF)与全脑BOLD信号的时间耦合分析
一、前言 笔者之前的文章《基于Dpabi和spm12的脑脊液(csf)分割和提取笔记》,介绍了如何从普通的fMRI数据中提取CSF信号。首先是基础的预处理,包括时间层校正、头动校正,再加上0.01-0.1Hz的带通滤波。接着用SPM12分割出CSF区域,设置一个比较严格的0.9阈值,确保提取的真是…...

实现websocket心跳检测,断线重连机制
WebSocket基础 WebSocket概念 WebSocket是一种革命性的 全双工通信协议 ,构建在TCP之上,旨在简化客户端与服务器之间的数据交换过程。通过单次握手建立持久连接,WebSocket实现了真正的双向实时通信,显著提高了交互效率。这一特性…...

ComfyUI节点安装笔记
AI高速发展,版本更新相当快(11月25日才安装的版本v.0.3.4,27日版本就已经更新到v.0.3.5了),在遇到问题,找到问题原因所在的过程中,ComfyUI版本、python版本、节点对环境版本的依赖,本…...
深度学习,训练集准确率高,但验证集准确率一直不上升,很低的问题
在训练过程中,训练集的准确率稳步上升,但是验证集的准确率一直在40%左右徘徊,从网上搜索可能的原因有: 1、学习率太小,陷入局部最优。 2、数据量太小(4000多条数据,应该还可以吧) …...

【C语言程序设计——选择结构程序设计】求输入的日期是该年的第几天(头歌实践教学平台习题)【合集】
目录😋 任务描述 相关知识 1、switch 结构基本语法 2、示例代码及解释 3、使用注意事项 4、判断闰年的条件 编程要求 测试说明 通关代码 测试结果 任务描述 本关任务:编写程序实现:从键盘上输入一个年月日(以空格或回车…...
Lumos学习王佩丰Excel二十四讲系列完结
“Lumos学习王佩丰Excel二十四讲系列”是一套完整的Excel教程,涵盖了从基础到高级的各种知识和技能。是我亲自一个个码出来的教程哇!!! 一、课程概览 该教程共分为24讲,每一讲都围绕Excel的一个核心主题进行深入讲解…...

前后端规约
文章目录 引言I 【强制】前后端交互的 API请求内容响应体响应码II 【推荐】MVC响应体III【参考】IV 其他引言 服务器内部重定向必须使用 forward;外部重定向地址必须使用 URL 统一代理模块生成,否则会因线上采用 HTTPS 协议而导致浏览器提示“不安全”,并且还会带来 URL 维护…...
【数据可视化】数据可视化看板需求梳理模板(含示例)
一、模板 设计一个数据可视化看板需要从多个方面梳理需求,以确保看板能够有效地传达信息并满足用户的需求。以下是一些关键方面: 1.目标和受众 ● 明确目标:确定看板的主要目的,例如监控业务指标、分析市场趋势、展示项目进度等…...
CArray原理是什么,通过示例来展示如何使用?
CArray是MFC(Microsoft Foundation Class)库中的一个模板类,用于实现动态数组的功能。它类似于C语言中的数组,但具有自动增长和缩小的能力,从而方便管理动态数据。以下是对CArray原理的解析以及一个使用示例。 CArray…...

更换WordPress主题的基础知识及注意事项
更换WordPress主题是优化和升级网站的重要步骤,不仅能够增强网站的视觉效果,还能改进用户体验并提高网站性能。然而,在进行该操作时,必须格外谨慎,避免数据丢失或功能失调的风险。本文将介绍在更换主题前需要采取的基本…...

springcloud篇3-docker需熟练掌握的知识点
docker的原理请参考博文《Docker与Kubernetes》。 一、安装docker的指令 1.1 安装yum工具 yum install -y yum-utils \device-mapper-persistent-data \lvm2 --skip-broken补充:配置镜像源 注意: yum安装是在线联网下载安装,而很多的资源…...

基于单片机的直流稳压电源的设计(论文+源码)
1.系统方案设计 在本次直流稳压电源的设计中,其关键指标如下: 系统输入电压220V交流系统输出直流0到12V可调,步进可以达到0.1V电流最大输出可以到2A具有短路保护功能可以通过液晶或者数码管等显示设备显示当前输出电压 2. 电路图...

uniapp-vue3 实现, 一款带有丝滑动画效果的单选框组件,支持微信小程序、H5等多端
采用 uniapp-vue3 实现, 是一款带有丝滑动画效果的单选框组件,提供点状、条状的动画过渡效果,支持多项自定义配置,适配 web、H5、微信小程序(其他平台小程序未测试过,可自行尝试) 可到插件市场下载尝试&…...
解锁 C 语言字符函数密码,开启高效编程之路
文章目录 一、字符函数的构成二、字符函数的分类1、字符分类函数1、isalnum函数2、isalpha函数3、isdigit函数4、islower函数5、isupper函数6、ispunct函数7、isspace函数8、iscntrl函数9、isxdigit函数10、isgraph函数11、isprint函数 2、字符转换函数 三、字符函数的应用 一、…...

LLM之RAG实战(五十一)| 使用python和Cypher解析PDF数据,并加载到Neo4j数据库
一、必备条件: python语言Neo4j数据库python库:neo4j、llmsherpa、glob、dotenv 二、代码: from llmsherpa.readers import LayoutPDFReaderfrom neo4j import GraphDatabaseimport uuidimport hashlibimport osimport globfrom datetime …...
力扣-数组-01两数之和
解析 遍历i和第i1,两个for循环查就可以,时间复杂度是 代码 class Solution { public:vector<int> twoSum(vector<int>& nums, int target) {vector<int> ansewer;bool flag false;for(int i 0;i < nums.size(); i){for(in…...

Flutter中的网络请求图片存储为缓存,与定制删除本地缓存
Flutter中的网络请求图片存储为缓存,与定制删除本地缓存 1:封装请求图片函数 2:访问的图片都会转为本地缓存,当相同的请求url,会在本地调用图片 3:本地缓存管理【windows与andriod已经测试】【有页面】【有…...

保障移动应用安全:多层次安全策略应对新兴威胁
在数字化时代,移动应用的安全问题变得越来越重要。随着网络威胁的不断升级,确保移动应用的安全性不仅是保护敏感数据的关键,也是维护用户信任的基础。为了应对复杂的安全挑战,企业必须采取先进的技术和多层次的安全策略࿰…...

【Linux】函数
一、函数 1、创建函数 如果定义了同名函数,则新定义的函数就会覆盖原先的定义的函数,而且在运行时不会报错。 创建函数的语法: 方法1:使用关键字function function name { commands } shell脚本中的函数名不能重复 方法2&#x…...

前后端交互过程中—各类文件/图片的上传、下载、显示转换
前后端交互过程中—各类文件/图片的上传、下载、显示转换 图片补充:new Blob()URL.createObjectURL()替代方案:FileReader.readAsDataURL()对比: tiff文件TIFF库TIFF转换通过url转换tiff文件为png通过文件选择的方式转换tiff文件为png 下…...

完美搭建appium自动化环境
🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 桌面版appium提供可视化操作appium主要功能的使用方式,对于初学者非常适用。 如何在windows平台安装appium桌面版呢,大体分两个步骤&…...
极速互联·智控未来——SG-Can(FD)Hub-600 六通道CANFD集线器
工业通信的全维进化,CANFD高速网络的终极枢纽! 核心革新 CANFD协议深度支持:名义波特率5K-1Mbps,数据域速率飙升至5Mbps(较传统CAN提升5倍),开启位速率转换最低100Kbps,完美兼容新旧…...
OpenLayers 地图定位
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 地图定位功能很常见,在移动端和PC端都需要经常用到,像百度、高德、谷歌都提供了方便快捷的定位功能。OpenLayers中也提供了定位的…...

day45python打卡
知识点回顾: tensorboard的发展历史和原理tensorboard的常见操作tensorboard在cifar上的实战:MLP和CNN模型 效果展示如下,很适合拿去组会汇报撑页数: 作业:对resnet18在cifar10上采用微调策略下,用tensorbo…...

CSS 平铺+自动换行效果
先上效果图 样式 <template><div class"activity-questions"><h1>活动题库</h1><div v-if"loading" class"loading">加载中...</div><div v-else><div v-if"questions.length 0" clas…...

永磁同步电机控制算法--模糊PI转速控制器
一、原理介绍 在常规的PID控制系统的基础上提出了一种模糊PID以及矢量变换方法相结合的控制系统,经过仿真分析对比证明: 模糊PID控制系统能够有效的提高永磁同步电机的转速响应速度,降低转矩脉动,增强了整体控制系统的抗干扰能力…...
【华为云Astro-服务编排】服务编排使用全攻略
目录 概述 为什么使用服务编排 服务编排基本能力 拖拉拽式编排流程 逻辑处理 对象处理 服务单元组合脚本、原生服务、BO、第三方服务 服务编排与模块间调用关系 脚本 对象 标准页面 BPM API接口 BO 连接器 如何创建服务编排 创建服务编排 如何开发服务编排 服…...
Mac 双系统
准备——Windows10 ISO文件下载 下载地址:https://msdn.itellyou.cn 操作系统 Win10-1903镜像 复制链接迅雷下载 第一步——查看系统磁盘剩余空间 打开“启动台”找到“其他”文件夹,打开“磁盘工具”(剩余空间要大于40GB) 第二…...

Haproxy的基础配置
1、参考文档 官方文档:HAProxy version 2.2.22 - Configuration Manual 运维派配置手册:Haproxy-基础配置详解 - 运维派 Haproxy 的配置文件haproxy.cfg由两大部分组成,分别是global和proxies部分。 2、haproxy global 配置 global&…...