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

数据结构之五:排序

  void*类型的实现:排序(void*类型)-CSDN博客

一、插入排序

1、直接插入排序

思想:把待排序的数据逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为止,得到一个新的有序序列 。

单趟

整体: 

实现

void InsertSort(int* arr, int sz) {assert(arr);int i = 0;for (i = 0; i < sz - 1; i++) {// 单趟:int end = i; // 有序序列的最后一个值int tmp = arr[end + 1];// 把end后面的第一个数据 往 0~end这个有序区间中插入while (end >= 0) {if (tmp < arr[end]) {arr[end + 1] = arr[end];end--;} else {break;}}arr[end + 1] = tmp;}
}
 2、希尔排序

希尔排序本质上是对直接插入排序的优化。

 代码实现:

void ShellSort(int* arr, int n) {// 1.gap>1相当于预排序,让数组接近有序// 2.gap==1相当于直接排序,保证有序int gap = n;int i = 0;while (gap > 1) {gap = gap / 3 + 1; // +1保证了最后一次gap一定是1// gap==1 最后一次就相当于直接插入排序// gap /= 2:效果没有/3好for (i = 0; i < n - gap; i++) {int end = i;int tmp = arr[end + gap];while (end >= 0) {if (tmp < arr[end]) {arr[end + gap] = arr[end];end -= gap;} else {break;}arr[end + gap] = tmp;}}}
}

对希尔排序多组并排的一个理解: 

  •  希尔排序的时间复杂度在O(N^1.3~N^2)之间。
  • 当且仅当待排数据有序的情况下希尔排序的时间复杂度于直接插入排序。

二、选择排序

 1、直接选择排序

思想:每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完 。(每次选一个数放到,放到新的位置)。

直接选择排序是很基础的一个排序,实现:

// 选择排序
// 优化,一次选两个数(最大和最小)放在合适位置
void SelectSort(int* arr, int n) {assert(arr);int begin = 0;int end = n - 1;while (begin < end) {// 在begin和end之间找出最大的数和最小的数的下标int maxi = begin;int mini = begin;int i = 0;for (i = begin + 1; i <= end; i++) {if (arr[maxi] < arr[i]) {maxi = i;}if (arr[mini] > arr[i]) {mini = i;}}Swap(&arr[begin], &arr[mini]);// 如果maxi和begin重叠,则maxi的值需要修正。if (begin == maxi) {maxi = mini;}Swap(&arr[end], &arr[maxi]);begin++;end--;}
}

时间复杂度:

  • T(N)=N*(N/2)=1/2*N^2,(优化后是N*N/2,优化前是N*N)。
  • 即:O(N^2) 。
2、堆排序

思路:堆排序(Heapsort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法,它是选择排序的一种。它是通过堆来进行选择数据。需要注意的是排升序要建小堆,排降序建大堆

直接实现:(在堆中有过讲解)

// 向下调整算法
void AdjustDown(int* arr, int n, int root) {int parent = root;int child = 2 * parent + 1;while (child < n) {if (child + 1 < n && arr[child] < arr[child + 1]) {child++;}if (arr[parent] < arr[child]) {Swap(&arr[parent], &arr[child]);parent = child;child = parent * 2 + 1;} else {break;}}
}
void HeapSort(int* arr, int n) {// 排升序,建大堆int i = 0;for (i = (n - 1 - 1) / 2; i >= 0; i--) {AdjustDown(arr, n, i); // 把arr调整为大堆}for (i = n - 1; i >= 0; i--) {Swap(&arr[i], &arr[0]);AdjustDown(arr, i, 0); // 排序}
}

三、交换排序

基本思想:交换,就是根据序列中两个记录键值的比较结果来对换这两个记录在序列中的位置。

交换排序的特点是:将键值较大的记录向序列的尾部移动,键值较小的记录向序列的前部移动。

1、冒泡排序

实现:

void BubbleSort(int* arr, int n) {int end = n;while (end > 0) {int exchange = 0;// 一趟for (int i = 1; i < end; i++) {if (arr[i - 1] > arr[i]) {Swap(&arr[i - 1], &arr[i]);exchange = 1;}}//优化:// 如果一趟冒泡的过程中没有发生交换,则前部分已经有序,不需要在冒泡if (exchange == 0) {break;}end--;}
}
2、快速排序

        快速排序是Hoare于1962年提出的一种二叉树结构的交换排序方法,其基本思想为:任取待排序元素序列中的某元素作为基准值,按照该排序码将待排序集合分割成两子序列,左子序列中所有元素均小于基准值,右子序列中所有元素均大于基准值,然后最左右子序列重复该过程,直到所有元素都排列在相应位置上为止。(找到一个key,左边必key小,右边比key大:升序)。

a.递归

实现:

// 三数取中:找到不大不小的数,让排有序时变为最优
int GetMidIndex(int* a, int begin, int end) {int mid = (begin + end) / 2;if (a[begin] < a[mid]) {if (a[mid] < a[end]) {return mid;} else if (a[begin] > a[end]) {return begin;} else {return end;}} else {if (a[mid] > a[end]) {return mid;} else if (a[begin] < a[end]) {return begin;} else {return end;}}
}int PartSort1(int* a, int begin, int end){//单趟快排1: 左右指针法// 三数取中的优化int midIndex = GetMidIndex(a, begin, end);Swap(&a[midIndex], &a[end]);int key = a[end];int keyindex = end;// 如果是右边做key,那么一定让左边先走,这样保证它们相遇的位置会比key大while (begin < end) {while (begin < end && a[begin] <= key) {begin++;}while (begin < end && a[end] >= key) {end--;}Swap(&a[begin], &a[end]);}Swap(&a[begin], &a[keyindex]);return end;
}void QuickSort(int* a, int left, int right) {assert(a);if (left < right) {int div = PartSort(a, left, right);// PrintArray(a, right - left + 1);// printf("[%d,%d]%d[%d,%d]\n", left, div - 1, div, div + 1,right);//[left,div-1]QuickSort(a, left, div - 1);//[div+1,right]QuickSort(a, div + 1, right);}
}

 对于单趟快排的其他办法:

法2:挖坑法,直接覆盖数据(不在调用Swap函数,性能比左右指针快一点)。

// 挖坑法:
int PartSort2(int* a, int begin, int end) {// 三数取中的优化int midIndex = GetMidIndex(a, begin, end);Swap(&a[midIndex], &a[end]);int key = a[end];// 挖出一个坑,可以直接把数据填入到相应位置:对左右指针法的一点修改while (begin < end) {while (begin < end && a[begin] <= key) {begin++;}// 左边找到比key大的,填到右边的坑,begin的位置形成新的坑a[end] = a[begin];while (begin < end && a[end] >= key) {end--;}// 右边找到比key小的,填到左边的坑,end的位置形成新的坑a[begin] = a[end];}// 把key填入到begin和end相遇的位置上(最后一个坑)a[end] = key;return end;
}

法3:前后指针法

// 前后指针法
int PartSort3(int* a, int begin, int end) {int prev = begin - 1;int cur = begin;int key = a[end];int keyIndex = end;while (cur < end) {if (a[cur] < key && ++prev != cur) {Swap(&a[prev], &a[cur]);}cur++;}Swap(&a[++prev], &a[keyIndex]);return prev;
}

 b.小区间优化

小区间使用插入排序可以减少递归层数,提升快排的效率:(小区间优化

当数据分割到小于等于10个数据时候,利用插入排序提升效率。

Q:为什么使用插入排序,而不是时间复杂度的更低的希尔排序或者堆排序?

A1:快速排序不断分割后,子序列趋近于有序

        前文中讲过,当待排数据趋近有序时,直接插入排序的时间复杂度趋近于O(N),因此,使用直接插入排序的性能要优于希尔排序和堆排序。

A2:希尔排序、堆排序、快速排序,都是对大量数据的排序。

        对于较少数据的排序(特别是趋近于有序的数据),使用插入排序的综合性能会更高一点。(插入排序对于小数据的排序性能不一定优于或者差于其他三种排序)。

void QuickSort(int* a, int left, int right) {assert(a);if (right - left + 1 < 10) {// 小区间使用插入排序InsertSort(a + left, right - left + 1);} else {// 大区间使用快速排序if (left < right) {int div = PartSort1(a, left, right);// PrintArray(a, right - left + 1);// printf("[%d,%d]%d[%d,%d]\n", left, div - 1, div, div + 1,right);//[left,div-1]QuickSort(a, left, div - 1);//[div+1,right]QuickSort(a, div + 1, right);}}
}
c.非递归(栈)

大区间单趟排,分割的两个小区间不在递归,而是保存在里面。

Q:为什么这里要用非递归实现呢?

A:递归实现的快排是由风险的,当待排的数据量特别大的时候,不断的递归会产生大量的栈帧,而计算机的栈帧仅有8M左右的大小,会发生栈溢出

实现:

void QuickSortNoR(int* a, int left, int right) {// 栈模拟实现Stack st;StackInit(&st); // 一定要记得初始化StackPush(&st, right);StackPush(&st, left);while (!StackEmpty(&st)) {int begin = StackTop(&st);StackPop(&st);int end = StackTop(&st);StackPop(&st);// 返回区间分割的keyIndexint div = PartSort1(a, begin, end);// 先对左区间分割,栈中先入右区间if (div + 1 < end) {// 入右区间右值StackPush(&st, end);// 入右区间左值StackPush(&st, div + 1);}if (div - 1 >= begin) {// 入左区间右值StackPush(&st, div - 1);// 入左区间左值StackPush(&st, begin);}}StackDestory(&st);
}//非递归同样可以使用小区间优化

 快排的时间复杂度分析: 

快排的时间复杂度:O(N*logN)。

快排的空间复杂度:O(logN)。(即栈帧的深度)


四、归并排序

基本思想:归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。(不断地拆分,让子序列有序,归并一个序列时,保持有序)。

二路归并:将两个有序表合并成一个有序表。

分解:(递归图)

 归并:

 递归实现

时间复杂度是:O(N*logN)

空间复杂度是:O(N) 

// 归并函数
void MergeArr(int* a, int begin1, int end1, int begin2, int end2, int* tmp) {int left = begin1, right = end2;int index = begin1;while (begin1 <= end1 && begin2 <= end2) {if (a[begin1] < a[begin2])tmp[index++] = a[begin1++];elsetmp[index++] = a[begin2++];}while (begin1 <= end1)tmp[index++] = a[begin1++];while (begin2 <= end2)tmp[index++] = a[begin2++];for (int i = left; i <= right; i++)a[i] = tmp[i];
}
// 归并的子函数
void _MergeSort(int* a, int left, int right, int* tmp) {if (left >= right)return;int mid = (left + right) / 2;//[left,mid] [mid+1,right]// 有序则可以合并,现在他们没有序,子问题解决_MergeSort(a, left, mid, tmp);_MergeSort(a, mid + 1, right, tmp);// 归并[left,mid] [mid+1,right]MergeArr(a, left, mid, mid + 1, right, tmp);
}// 递归实现归并排序
void MergeSort(int* a, int n) {assert(a);int* tmp = (int*)malloc(sizeof(int) * n);_MergeSort(a, 0, n - 1, tmp);free(tmp);
}
非递归实现

非递归需要修正边界

非递归的时间复杂度:(从while循环入手)O(N*logN)

非递归的空间复杂度:O(N)

void MergeSortNoR(int* a, int n) {assert(a);int* tmp = (int*)malloc(sizeof(int) * n);// 迭代实现int gap = 1;int i = 0;while (gap < n) {for (i = 0; i < n; i += 2 * gap) {//[i,i+gap-1] [i+gap,i+2*gap-1]int begin1 = i;int end1 = i + gap - 1;int begin2 = i + gap;int end2 = i + 2 * gap - 1;// 1、合并时只有第一组,第二组不存在就不需要合并if (begin2 >= n) {break;}// 2、合并时第二组只有部分数据,需要修正end2边界if (end2 >= n) {end2 = n - 1;}MergeArr(a, begin1, end1, begin2, end2, tmp);PrintArray(a, n);}gap *= 2;}/*free(tmp);tmp == NULL;*/
}

五、内外排序

内(外)排序并不是特指某一种排序算法,而是针对不同存储的空间的排序方法。

内排序:指的是在内存中进行排序。

外排序:指的是在外存(文件、磁盘)中进行排序。

外排序实现需要利用C对文件的操作:

//合并两个有序数据的文件
void _MergeFile(const char* file1, const char* file2, const char* mFile) {FILE* pf1 = fopen(file1, "r");if (pf1 == NULL) {printf("2:%s\n", strerror(errno));exit(-1);}FILE* pf2 = fopen(file2, "r");if (pf2 == NULL) {printf("3:%s\n", strerror(errno));exit(-1);}FILE* fin = fopen(mFile, "w");if (fin == NULL) {printf("4:%s\n", strerror(errno));exit(-1);}int num1 = 0;int num2 = 0;int ret1 = fscanf(pf1, "%d\n", &num1) != EOF;int ret2 = fscanf(pf2, "%d\n", &num2) != EOF;while (ret1 != EOF && ret2 != EOF) { // 文件指针是自动的,都往后移动if (num1 < num2) {fprintf(fin, "%d\n", num1);ret1 = fscanf(pf1, "%d\n", &num1);// fseek(pf2, SEEK_CUR, -1);} else {fprintf(fin, "%d\n", num2);ret2 = fscanf(pf2, "%d\n", &num2);// fseek(pf1, SEEK_CUR, -1);}}while (ret1 != EOF) {fprintf(fin, "%d\n", num1);ret1 = fscanf(pf1, "%d\n", &num1);}while (ret2 != EOF) {fprintf(fin, "%d\n", num2);ret2 = fscanf(pf2, "%d\n", &num2);}fclose(pf1);fclose(pf2);fclose(fin);
}void MergeSortFile(const char* file) {FILE* pf = fopen(file, "r");if (pf == NULL) {printf("1:%s\n", strerror(errno));exit(-1);}// 分割成小文件,内存排序后写到小文件中int n = 10;int a[10] = {0};int num = 0;int i = 0;// char* subfile = (char *)malloc(sizeof(char));char subfile[20];int filei = 0;while (fscanf(pf, "%d\n", &num) != EOF) {if (i < n - 1) {a[i++] = num;} else {a[i] = num;QuickSort(a, 0, n - 1);sprintf(subfile, "%d", filei++);FILE* fin = fopen(subfile, "w");for (i = 0; i < n; i++) {fprintf(fin, "%d\n", a[i]);}fclose(fin);i = 0;memset(a, 0, sizeof(int) * n);}}// 文件两两合并char mFile[100] = "12";char file1[100] = "1";char file2[100];for (i = 1; i <= n; i++) {sprintf(file2, "%d", i);// 读取file1和file2,归并出mfile_MergeFile(file1, file2, mFile);strcpy(file1, mFile);sprintf(mFile, "%s%d", mFile, i + 1);}fclose(pf);
}

六、非比较排序

        非比较排序是很“小众”的排序,因为这两种排序只适用于整数类型的排序。不能排序浮点数和字符串型的数据,对于这些类型的数据要用比较排序法来排序。

1、计数排序

思想:计数排序又称为鸽巢原理,是对哈希直接定址法的变形应用。是一种非比较排序

  1. 统计相同元素出现次数
  2. 根据统计的结果将序列回收到原来的序列中

实现:

void CountSort(int* a, int n) {int min = a[0];int max = a[0];int i = 0;for (i = 0; i < n; i++) {if (min > a[i]) {min = a[i];}if (max < a[i]) {max = a[i];}}int range = max - min + 1;int* countArr = (int*)calloc(range, sizeof(int));if (countArr == NULL) {return;}// memset(countArr, 0, sizeof(int) * range);for (i = 0; i < n; i++) {countArr[a[i] - min]++; // 偏移量映射}int index = 0;for (i = 0; i < range; i++) {int j = 0;for (j = 0; j < countArr[i]; j++) {a[index++] = i + min;}}free(countArr);
}
2、基数排序

        基数排序即:桶排序。可以参考:【算法】桶排序(Bucket Sort)详解-CSDN博客,桶排序不是很重要,了解即可。


总结

1、几种排序的时间复杂度比较

2、排序的稳定性

          稳定性:由某一算法完成的排序后,数组中相同元素的相对位置保持不变。即表示该算法是稳定的,否则表示该算法不稳定。


3、归并外部文件的排序(了解即可)

相关文章:

数据结构之五:排序

void*类型的实现&#xff1a;排序&#xff08;void*类型&#xff09;-CSDN博客 一、插入排序 1、直接插入排序 思想&#xff1a;把待排序的数据逐个插入到一个已经排好序的有序序列中&#xff0c;直到所有的记录插入完为止&#xff0c;得到一个新的有序序列 。 单趟&#x…...

科研绘图系列:R语言绘制热图和散点图以及箱线图(pheatmap, scatterplot boxplot)

禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍加载R包数据下载图1图2图3系统信息参考介绍 R语言绘制热图和散点图以及箱线图(pheatmap, scatterplot & boxplot) 加载R包 library(magrittr) library(dplyr) library(ve…...

基于 webRTC Vue 的局域网 文件传输工具

文件传输工具&#xff0c;匿名加密&#xff0c;只需访问网页&#xff0c;即可连接到其他设备&#xff0c;基于 webRTC 和 Vue.js coturn TURN 服务器 docker pull coturn/coturn docker run -d --networkhost \-v $(pwd)/my.conf:/etc/coturn/turnserver.conf \coturn/coturn…...

LeetCode 718. 最长重复子数组 java题解

https://leetcode.cn/problems/maximum-length-of-repeated-subarray/description/ 动态规划 class Solution {public int findLength(int[] nums1, int[] nums2) {int len1nums1.length,len2nums2.length;int[][] dpnew int[len11][len21];dp[0][0]0;//没有意义&#xff0c;…...

算法知识-15-深搜

一、概念 深度优先搜索&#xff08;Deep First Search, DFS&#xff09;是一种用于遍历或搜索树或图的算法。这种策略沿着树的深度遍历树的节点&#xff0c;尽可能深地搜索树的分支。 二、关键步骤 选择起点&#xff1a;根据题目要求&#xff0c;选择一个或多个节点作为搜索…...

区块链dapp 开发详解(VUE3.0)

1、安装metamask 插件。 2、使用封装的工具包: wagmi . 3、 wagmi 操作手册地址:connect | Wagmi 4、注意事项&#xff1a; 因为最初是react 版本&#xff0c;所以在VUE版的官方文档有很多地方在 import 用的是 wagmi,需要改为 wagmi/vue 。 连接成功后打印的内容如下&…...

Plugin [id: ‘flutter‘] was not found in any of the following sources解决方法

文章目录 错误描述解决方法修正方案&#xff1a;继续使用 apply from修正后的 build.gradle说明警告的处理进一步验证 错误描述 Plugin [id: ‘flutter’] was not found in any of the following sources: Gradle Core Plugins (not a core plugin, please see https://docs…...

专升本-高数 1

第 0 章&#xff0c;基础知识 一&#xff0c;重要公式 1、完全平方 (ab)a2abb (a-b)a-2abb 2、平方差公式 &#xff08;a-b&#xff09;(ab)a-b 3、立方差公式 a-b(a-b)(aabb) 4、 立方和公式 ab(ab)(a-abb) 二&#xff0c;基本初等函数 1&#xff0c;幂函数 一元二…...

【考前预习】3.计算机网络—数据链路层

往期推荐 【考前预习】2.计算机网络—物理层-CSDN博客 【考前预习】1.计算机网络概述-CSDN博客 浅谈云原生--微服务、CICD、Serverless、服务网格_云原生cicd-CSDN博客 子网掩码、网络地址、广播地址、子网划分及计算_子网广播地址-CSDN博客 浅学React和JSX-CSDN博客 目录 1.数…...

DockeUI 弱口令登录漏洞+未授权信息泄露

0x01 产品描述: DockerUI是一款开源的、强大的、轻量级的Docker管理工具。DockerUI覆盖了 docker cli 命令行 95% 以上的命令功能,通过可视化的界面,即使是不熟悉docker命令的用户也可以非常方便的进行Docker和Docker Swarm集群进行管理和维护。0x02 漏洞描述: DockerUI中存…...

【电子元器件】电感基础知识

本文章是笔者整理的备忘笔记。希望在帮助自己温习避免遗忘的同时&#xff0c;也能帮助其他需要参考的朋友。如有谬误&#xff0c;欢迎大家进行指正。 一、 电感的基本工作原理 1. 电感的基本工作原理如下&#xff1a; &#xff08;1&#xff09; 当线圈中有电流通过时&#…...

【SSH+X11】VsCode使用Remote-SSH在远程服务器的docker中打开Rviz

&#x1f680;今天来分享一下通过VsCode的Remote-SSH插件在远程服务器的docker中打开Rviz进行可视化的方法。 具体流程如下图所示&#xff0c;在操作开始前&#xff0c;请先重启设备&#xff0c;排除之前运行配置的影响&#xff1a; ⭐️ 我这里是使用主机连接服务器&#xff…...

Vue Web开发(五)

1. axios axios官方文档 异步库axios和mockjs模拟后端数据&#xff0c;axios是一个基于promise的HTTP库&#xff0c;使用npm i axios。在main.js中引入&#xff0c;需要绑定在Vue的prototype属性上&#xff0c;并重命名。   &#xff08;1&#xff09;main.js文件引用 imp…...

HarmonyOS:使用Grid构建网格

一、概述 网格布局是由“行”和“列”分割的单元格所组成&#xff0c;通过指定“项目”所在的单元格做出各种各样的布局。网格布局具有较强的页面均分能力&#xff0c;子组件占比控制能力&#xff0c;是一种重要自适应布局&#xff0c;其使用场景有九宫格图片展示、日历、计算器…...

开源Java快速自测工具,可以调用系统内任意一个方法

java快速测试框架&#xff0c;可以调到系统内任意一个方法&#xff0c;告别写单测和controller的困扰。 开源地址&#xff1a;https://gitee.com/missyouch/Easy-JTest 我们在开发时很多时候想要测试下自己的代码&#xff0c;特别是service层或者是更底层的代码&#xff0c;就…...

力扣刷题TOP101: 29.BM36 判断是不是平衡二叉树

目录&#xff1a; 目的 思路 复杂度 记忆秘诀 python代码 目的&#xff1a; 输入一棵节点数为 n 二叉树&#xff0c;判断该二叉树是否是平衡二叉树。 思路 什么是平衡二叉树&#xff08;AVL 树&#xff09;&#xff1f; 每个节点的左子树和右子树的高度差不能超过 1。确保…...

【在Linux世界中追寻伟大的One Piece】自旋锁

目录 1 -> 概述 2 -> 原理 3 -> 优缺点及使用场景 3.1 -> 优点 3.2 -> 缺点 3.3 -> 使用场景 4 -> 纯软件自旋锁类似的原理实现 4.1 -> 结论 5 -> 样例代码 1 -> 概述 自旋锁是一种多线程同步机制&#xff0c;用于保护共享资源避免受并…...

前端编辑器JSON HTML等,vue2-ace-editor,vue3-ace-editor

与框架无关 vue2-ace-editor有问题&#xff0c;ace拿不到&#xff08;brace&#xff09; 一些组件都是基于ace-builds或者brace包装的 不如直接用下面的&#xff0c;不如直接使用下面的 <template><div ref"editor" class"json-editor"><…...

C++ 中的运算符重载

运算符重载是C中的一种特性&#xff0c;它允许开发者为自定义类型定义或改变标准运算符的行为。通过运算符重载&#xff0c;你可以使得用户定义的类像内置类型一样使用运算符&#xff0c;比如加法、减法、赋值等。 如何在C中进行运算符重载&#xff1f; 重载运算符的语法&#…...

渗透测试工具 -- SQLmap安装教程及使用

随着网络安全问题日益严峻&#xff0c;渗透测试成为了保护信息安全的重要手段。而在渗透测试的众多工具中&#xff0c;SQLmap凭借其强大的自动化SQL注入检测和利用能力&#xff0c;成为了网络安全专家必备的利器。那么&#xff0c;你知道如何高效地使用SQLmap进行漏洞扫描吗&am…...

使用 Database Tools 实现高效数据查询的十大 IntelliJ IDEA 快捷键

得益于 IntelliJ IDEA Ultimate 的 Database Tools&#xff08;数据库工具&#xff09;中的专用 SQL 查询控制台&#xff0c;您无需离开 IDE 即可轻松修改连接到您的 Java 应用程序的任何数据库中的数据&#xff0c;以及从这些数据库中提取数据。 查询控制台具有 SQL 语句特定的…...

SpringBoot 整合 RabbitMQ 实现流量消峰

RabbitMQ 即一个消息队列&#xff0c;主要是用来实现应用程序的异步和解耦&#xff0c;同时也能起到消息缓冲&#xff0c;消息分发的作用。 消息中间件在互联网公司的使用中越来越多&#xff0c;刚才还看到新闻阿里将 RocketMQ 捐献给了 Apache&#xff0c;当然了今天的主角还…...

大数据挖掘建模平台案例分享

大数据挖掘建模平台是由泰迪自主研发&#xff0c;面向企业级用户的大数据挖掘建模平台。平台采用可视化操作方式&#xff0c;通过丰富内置算法&#xff0c;帮助用户快速、一站式地进行数据分析及挖掘建模&#xff0c;可应用于处理海量数据、高复杂性的数据挖掘任务&#xff0c;…...

MySQL数据表的管理

1.创建表 语法&#xff1a; create table 表名( 字段名 字段里保存数据的类型【(数据的长度) 约束】, 字段名 字段里保存数据的类型【(数据的长度) 约束】, 字段名 字段里保存数据的类型【(数据的长度) 约束】 ...... ); 注意&#xff1a;数据类型和约束&#xff0c;接下来用…...

SpringBoot【十三(实战篇)】集成在线接口文档Swagger2

一、前言&#x1f525; 环境说明&#xff1a;Windows10 Idea2021.3.2 Jdk1.8 SpringBoot 2.3.1.RELEASE 二、如何生成Swagger文档 上一期我们已经能正常访问swagger在线文档&#xff0c;但是文档空空如也&#xff0c;对不对&#xff0c;接下来我就教大家怎么把相关的接口都给…...

【C++初阶】第8课—标准模板库STL(string_2)

文章目录 1. string类对象遍历操作1.1 标准库中的成员函数begin( )和end( )1.2 标准库中的成员函数rbegin( )和rend( )1.3 C11引入的4个标准库中的成员函数 2. string类对象的访问2.1 operator[ ]运算符重载访问字符串字符2.2 公有成员函数at访问字符2.3 公有成员函数back()和f…...

【arm】程序跑飞,SWD端口不可用修复(N32G435CBL7)

项目场景&#xff1a; 国民N32G43X系列&#xff0c;烧录了一个测试程序&#xff0c;在DEBUG中不知什么原因挂掉&#xff0c;然后就无法连接SWD或JLINK。 问题描述 在SWD配置中不可见芯片型号&#xff0c;无法connect&#xff0c;无法烧录。但基本判断是芯片没有损坏。怀疑是程…...

https证书生成、linux 生成https证书、nginx 配置https证书

1. 检查 Certbot 是否已安装 which certbot 2. 安装 Certbot 2.1启用 EPEL 仓库&#xff08;如果尚未启用&#xff09;&#xff1a; sudo yum install epel-release 2.2 安装 Certbot 和 Nginx 插件&#xff1a; sudo yum install certbot python3-certbot-nginx 2.3验证安…...

Halcon随机贴图生成缺陷图片脚本

halcon随机贴图生成缺陷图片&#xff0c;用于深度学习训练: read_image (Image, C:/Users/61082/Desktop/bentiiamge/omron/S06-1211/ok/ok_images/D246B_CPFNNUBA8LT0SX_AAA_S2412001793_C1216_1733895885320066.jpg) get_image_size (Image, Width, Height) gen_rectangle1 …...

[ZMQ] -- ZMQ通信Protobuf数据结构 1

1、前言背景 工作需要域间实现zmq通信&#xff0c;刚开始需要比较简单的数据结构&#xff0c;比如两个bool&#xff0c;后面可能就需要传输比较大的数据&#xff0c;所以记录下实现流程&#xff0c;至于为啥选择proto数据结构去做大数据传输&#xff0c;可能是地平线也用这个&…...