常用排序算法详解

  • 1.冒泡排序
    • 原理
    • 示例
    • 代码实现
  • 2.快速排序
    • 原理
    • 示例
    • 代码实现
  • 3.插入排序
    • 原理
    • 示例
    • 代码实现
  • 4.希尔排序
    • 原理
    • 示例
    • 代码实现
  • 5.选择排序
    • 原理
    • 示例
    • 代码实现
  • 6.堆排序
    • 原理
    • 示例
    • 代码实现
  • 7.归并排序
    • 原理
    • 示例
    • 代码实现

本文讲述了常见的排序算法的执行过程,有详细实现过程举例

1.冒泡排序

原理

冒泡排序是指不断的遍历数组,比较相邻两个数的大小,如果顺序不对就将其掉换位置,直到所有的数据位置都正确

示例

原始数组 :[ 6 , 1 , 8 , 3 , 5 , 9 , 2 , 4 ]

操作次数排序结果操作
原始数组[6,1, 8 , 3 , 5 , 8 , 2 , 4 ]进行第一次遍历,比较6和1,位置不对交换
第一次交换结果[ 6 ,1, 8, 3 , 5 , 9 , 2 , 4 ]比较1和8,不交换
第二次交换结果[ 6 , 1 ,8,3, 5 , 9 , 2 , 4 ]比较8和3,交换
第三次交换结果[ 6 , 1 , 3 ,8,5, 9 , 2 , 4 ]比较8和5,交换
第四次交换结果[ 6 , 1 , 3 , 5 ,8,9, 2 , 4 ]比较8和9,不交换
第五次交换结果[ 6 , 1 , 3 , 5 , 8 ,9,2, 4 ]比较9和2,交换
第六次交换结果[ 6 , 1 , 3 , 5 , 8 , 2 ,9,4]比较9和4,交换
第七次交换结果[ 6 , 1 , 3 , 5 , 8 , 2 , 4 ,9]第一次有交换,遍历第二次
遍历第二次结果[ 1 , 3 , 5 , 6 , 2 , 4 ,8,9]第二次有交换,遍历第三次
遍历第三次结果[ 1 , 3 , 5 , 2 , 4 , 6,8,9]第三次有交换,遍历第四次
遍历第四次结果[ 1 , 3 , 2 , 4 , 5,6,8,9]第四次有交换,遍历第五次
遍历第五次结果[ 1 , 2 , 3 , 4,5,6,8,9]第五次有交换,遍历第六次
遍历第六次结果[1,2,3,4,5,6,8,9]第六次无交换,遍历结束

代码实现

    public static int[] sort(int[] sourceArray) throws Exception {//冒泡排序int length = sourceArray.length;//获取数组长度int[] arr = sourceArray;//拷贝数组//for循环用于进行书组遍历for (int i = 0; i < length ; i++) {int l = 0,r = 1;//定义左右指针int a = 0;//用于记录交换次数//while循环用于每次遍历下的数据交换while (l<length && r<length){if (arr[l] < arr[r] ) {//左小于右(正确顺序)针指i和j整体向右挪一个l++;r++;}else {//左大于右(不正确顺序)交换左右,然后针指i和j整体向右挪一个//交换左右int t = arr[l];arr[l] = arr[r];arr[r] = t;//然后针指i和j整体向右挪一个l++;r++;//记录交换次数a++;}}//判断此次遍历是否发生数据交换if (a == 0){break;}}//返回排序后的结果return arr;}

2.快速排序

原理

1.先从数列中取出一个数作为key值(标杆值);
2.将比这个数小的数全部放在它的左边,大于或等于它的数全部放在它的右边;

挖坑填数字,每次比较都拿出一个标杆来和数据进行比较,先从右往左比,遇到比标杆小的就将其放在标杆的坑里(标杆数字所在的数组位置),换过去的数字所在位置成为新的坑,然后在从原来标杆的那个坑(刚刚放进数字的位置)从左往右比较,遇到比标杆数字大或等于的,就放在此时标杆位置所在的坑中,然后再从现在的这个刚放进去数字的坑从有往左比较,知道所有数字均符合左边比标杆小,右边比标杆大

3.对左右两个小数列重复第二步,直至各区间只有1个数。

示例

原始数组 :[ 6 , 1 , 8 , 3 , 5 , 9 , 2 , 4 ]
对原始数组进行第一个标杆的比较:

操作标杆数据结果下一步比较
拿出标杆数据6[ _, 1 , 8 , 3 , 5 , 9 , 2 , 4 ]<从右往左比,比较4和标杆数据
4小于标杆数据,4填坑6[4, 1 , 8 , 3 , 5 , 9 , 2 , _ ]>从左往右比,比较1和标杆数据
1小于标杆数据,不变6[4, 1 , 8 , 3 , 5 , 9 , 2 , _ ]>从左往右比,比较8和标杆数据
8大于标杆数据,8填坑6[4, 1 , _, 3 , 5 , 9 , 2 , 8 ]<从右往左比,比较2和标杆数据
2大于标杆数据,2填坑6[4, 1 , 2, 3 , 5 , 9 ,_, 8 ]>从左往右比,比较3和标杆数据
3小于标杆数据,不变6[4, 1 , 2,3 , 5 , 9 ,_, 8 ]>从左往右比,比较5和标杆数据
5小于标杆数据,不变6[4, 1 , 2, 3 , 5 , 9 ,_, 8 ]>从左往右比,比较9和标杆数据
9大于标杆数据,9填坑6[4, 1 , 2, 3 , 5 ,_ ,9, 8 ]左右比较交汇,该标杆放回坑内
标杆放回坑里[4, 1 , 2, 3 , 5 ,6 ,9, 8 ]该轮比较结束,对标杆6左右进行上述比较

对标杆两边重复上述操作:
(1)标杆6左边数据比较:得到:[ 1,2,3,4,5 ]

操作标杆数据结果下一步比较
拿出标杆数据4[ _ , 1 , 2, 3 , 5 ]<从右往左比,比较5和标杆数据
5大于标杆数据,不变4[ _ , 1 , 2, 3 , 5 ]<从右往左比,比较3和标杆数据
3小于标杆数据,3填坑4[3, 1 , 2, _ , 5 ]>从左往右比,比较1和标杆数据
1小于标杆数据,不变4[3, 1 , 2, _ , 5 ]>从左往右比,比较2和标杆数据
2小于标杆数据,不变4[3, 1 , 2, _ , 5 ]左右比较交汇,该标杆放回坑内
标杆放回坑里,对左右比较[3, 1 , 2, 4 , 5 ]该轮比较结束,对标杆4左右比较,右边只有一位不比较
标杆4左边比较3[2, 1 ,3 ]该轮比较结束,对标杆3左右比较,右边没有不比较
对标杆3左右比较2[ 1, 2 ]该轮比较结束,标杆左边只有一位,不再比较

(2)标杆6右边数据比较:得到:[ 8,9 ]

操作标杆数据结果下一步比较
拿出标杆数据9[ _, 8 ] <从右往左比,比较8和标杆数据
2小于标杆数据,8填坑9[ 8, _ ] 左右比较交汇,该标杆放回坑内
标杆放回坑里[ 8, 9 ]该轮比较结束,标杆左边只有一位,不再比较

最终的到数据:[ 1,2,3,4,5,6,8,9 ]

代码实现

public static void quickSort(int a[],int l,int r){if(l>=r)return;int i = l; int j = r; int key = a[l];//选择第一个数为标杆while(i<j){while(i<j && a[j]>=key)//从右向左找第一个小于标杆的值j--;if(i<j){a[i] = a[j];i++;}while(i<j && a[i]<key)//从左向右找第一个大于标杆的值i++;if(i<j){a[j] = a[i];j--;}}//i == ja[i] = key;quickSort(a, l, i-1);//递归调用quickSort(a, i+1, r);//递归调用}

3.插入排序

原理

1.将数组第一个数当成一个有序数组,然后从第二个数据开始看作无序数组
2.每次拿出无序数组中的第一个数据和有序数组的最后一位开始向前比较
3.将拿出的数据插入有序数组中的合适位置
4.重复上述步骤直至无序数组中所有的数据全部插入有序数组中。

示例

原始数组 :[ 6 , 1 , 8 , 3 , 5 , 9 , 2 , 4 ]

操作有序数组无序数组拿出来的数据
将数组分成有序数组和无序数组61、8、3、5、9、2、41
从后往前比较有序数组,将1插入有序数组1、68、3、5、9、2、48
从后往前比较有序数组,将8插入有序数组1、6 、83、5、9、2、43
从后往前比较有序数组,将3插入有序数组1、3、6 、85、9、2、45
从后往前比较有序数组,将5插入有序数组1、3、5、6 、89、2、49
从后往前比较有序数组,将9插入有序数组1、3、5、6 、8、92、42
从后往前比较有序数组,将2插入有序数组1、2、3、5、6 、8、944
从后往前比较有序数组,将4插入有序数组1、2、3、4、5、6 、8、9

代码实现

    public static void main(String[] args) {int[] nums={ 6 , 1 , 8 , 3 , 5 , 9 , 2 , 4 };int start=1;for(start=1;start<nums.length;start++) {int insert=nums[start];//将数组第二个数据拿出放入insert,做为待插入的数据while(start>0) {if(nums[start-1]>insert) {//从后往前比较,遇到比该数字大的了就将大的数字往后挪一个位置nums[start]=nums[start-1];} else {//若遇到和拿出数字相同的数据,则将insert放入当前空缺位置nums[start]=insert;break;//结束当前循环}start--;//比较的数字往前挪一个}if(start==0) {nums[0]=start;}}for (int i = 0; i < nums.length; i++) {System.out.print(nums[i]+" ");}}

4.希尔排序

希尔排序也称递减增量排序,是对插入排序的改进,以牺牲稳定性的方法提高效率。

原理

1.根据数组长度确定增长量k2(k1 = length / 2)(例如:数组[ 1 , 5 , 3 , 8 , 9 , 3 ])
2.按照增量数列进行分组,一般分成k组(每组数据的两个数据相距k个位置,例如:k为3时,位置0和位置3一组,位置1和位置4一组,位置2和位置5一组)
3.比较每组的数据将其按照增量排序(比较:位置0和位置3数据,位置1和位置4数据,位置2和位置5数据,位置不对的交换)
4.确定增长量k2(k2 = k2 / 2)
5.按照增量数列进行分组,分为k2组(例如:k2 = 2 ,分组:位置0 位置2 位置4一组,位置1 位置3 位置5一组)
6.比较每组的数据将其按照增量排序
…(循环以上步骤直至k=1时为最后一趟)

示例

原始数组 :[ 6 , 1 , 8 , 3 , 5 , 9 , 2 , 4 ]

操作k值结果
计算k值,将原始数据分为k组46 , 1 , 8 , 3 , 5 , 9 , 2 , 4
四组分别排序(交换了第一组6,5 ,第三组8,2)45 , 1 , 2 , 3 , 6 , 9 , 8 , 4
重新计算k,将数据分为k组25, 1 , 2 , 3 , 6 , 9 , 8 , 4
两组分别排序22, 1 , 5 , 3 , 6 , 4 , 8 , 9
计算k,并分组12, 1 , 5 , 3 , 6 , 4 , 8 , 9
排序11, 2 , 3 , 4 , 5 , 6 , 8 , 9

代码实现

    public static void main(String[] args) {int[] nums={1,5,7,9,3,2,4,0,6,8,5};//控制增量序列,增量序列为1的时候为最后一趟for (int i = nums.length/2; i > 0; i/=2) {//根据增量序列,找到每组比较序列的最后一个数的位置for (int j = i; j <nums.length ; j++) {//根据该比较序列的最后一个数的位置,依次向前执行插入排序for (int k = j-i; k >= 0 ; k-=i) {if(nums[k]>nums[k+i]) {int tmp=nums[k];nums[k]=nums[k+i];nums[k+i]=tmp;}}}}System.out.println(Arrays.toString(nums));}

5.选择排序

原理

1.将数组中最小的数据拿出,放在数组第一个作为排序数组
2.在未排序数组中找出最小的,放在拍叙述组的尾部
3.循环执行,直到所有的数字排序完成

示例

原始数组 :[ 6 , 1 , 8 , 3 , 5 , 9 , 2 , 4 ]

操作排序数组未排序数组未排序数组中最小的
原始数组6 , 1 , 8 , 3 , 5 , 9 , 2 , 41
将1放在数组第一位最为排序数组 16 , 8 , 3 , 5 , 9 , 2 , 42
将1放在数组第一位最为排序数组1,26 , 8 , 3 , 5 , 9 , 43
将1放在数组第一位最为排序数组1,2,36 , 8 , 5 , 9 , 44
将1放在数组第一位最为排序数组1 ,2,3,46 , 8 , 5 , 95
将1放在数组第一位最为排序数组1 ,2,3,4,56 , 8 , 96
将1放在数组第一位最为排序数组1,2,3,4,5,68 , 98
将1放在数组第一位最为排序数组1,2,3,4,5,6,899
将1放在数组第一位最为排序数组1,2,3,4,5,6,8 ,9

代码实现

    public static void main(String[] args) {int[] nums={1,5,7,9,3,2,4,0,6,8,5};int start=1;for(start=1;start<nums.length;start++) {int insert=nums[start];while(start>0) {if(nums[start-1]>insert) {nums[start]=nums[start-1];} else {nums[start]=insert;break;}start--;}if(start==0) {nums[0]=start;}}for (int i = 0; i < nums.length; i++) {System.out.print(nums[i]+" ");}}

6.堆排序

堆排序是一种选择排序
堆是一颗完全二叉树:
当所有的结点的值都大于或等于其左右的子结点的值称为大顶堆
当所有的结点的值都小于或等于其左右的子结点的值称为小顶堆

原理

1.先将数组排序成一个大根堆
2.将根节点和最后一个叶子借点交换
3.将非最后一个叶子节点的其他数据排序成大根堆(此时最后一个叶子节点为上一轮排序中的根节点,最大的数据,位置已经确定了)
4.交换该大根堆中的根节点和最后一个叶子结点
…(循环直到所有数据均排列完成)

示例

操作数组
原始数组6 , 1 , 8 , 3 , 5 , 9 , 2 , 4
第一轮大根堆交换节点后结果3,5,8,4,1,6,2,9
第二轮大根堆交换节点后结果2,5,6,4,1,3,89
第三轮大根堆交换节点后结果2,5,3,4,1,689
第四轮大根堆交换节点后结果1,4,3,2,5689
第五轮大根堆交换节点后结果1,2,3,45689
第六轮大根堆交换节点后结果1,2,345689
第七轮大根堆交换节点后结果1,2345689
第八轮大根堆交换节点后结果12345689

具体过程:
在这里插入图片描述

代码实现

import java.util.Arrays;public class HeapSort {public static void main(String[] args) {int[] arr = {3, 5, 2, 7,4,5,8,2,1,9,0,5,4};heapSort(arr);System.out.println(Arrays.toString(arr));}//堆排序public static void heapSort(int[] arr) {//将无序序列构建成一个堆for (int i = arr.length / 2 - 1; i >= 0; i--) {adjustHeap(arr, i, arr.length);}//将堆顶元素和末尾元素交换,将最大元素放置数组末端//重新调整至堆结构,然后继续将堆顶元素和当前末尾元素交换,以此往复for (int i = arr.length - 1; i > 0; i--) {int temp = arr[i];arr[i] = arr[0];arr[0] = temp;adjustHeap(arr, 0, i);}}// 将二叉树调整为堆public static void adjustHeap(int[] arr, int i, int length) {int temp = arr[i];//k=2i+1是i的左子结点for (int k = i * 2 + 1; k < length; k = k * 2 + 1) {if (k + 1 < length && arr[k] < arr[k + 1])//左子结点的值<右子结点的值k++;//指向右节点if (arr[k] > temp) {//如果子结点的值>根节点的值arr[i] = arr[k];//将较大的值赋给当前结点i = k;//i指向k,继续循环比较} elsebreak;}//for循环后,已经将以i为根结点的树的最大值,放在了顶部arr[i] = temp;//将temp值放到调整后的位置}
}

7.归并排序

原理

1.将数组分成不同的组,每次平均分成两个数组,直到无法分成两份
2.将两个长度为1的数组合并成一个长度为2的有序数组
3.将两个长度为2的数组合并成一个长度为4的有序数组
…(重复多遍)
4.直至和并完成

示例

操作数组结果
原始数组[ 6 , 1 , 8 , 3 , 5 , 9 , 2 , 4 ]
[ 6 , 1 , 8 , 3 ] 、 [ 5 , 9 , 2 , 4 ]
[ 6 , 1 ] 、 [ 8 , 3 ] 、 [ 5 , 9 ] 、 [2 , 4 ]
[ 6 ]、 [1 ] 、 [ 8 ]、 [ 3 ] 、 [ 5 ] 、 [9 ] 、 [2 ]、 [ 4 ]
[1 , 6 ] 、[ 3 , 8 ] 、 [ 5 , 9 ] 、[ 2 , 4 ]
[1 , 3 , 6 ,8 ] 、 [ 2, 4 ,5 ,9 ]
[ 1,2,3,4,5,6,8,9 ]

代码实现

public class Test {public static void main(String[] args) {int[] arr = { 6 , 1 , 8 , 3 , 5 , 9 , 2 , 4 };int[] temp = new int[arr.length];//归并排序需要额外的数组空间mergeSort(arr, 0, arr.length - 1, temp);//将数组分成最小单元System.out.println(Arrays.toString(arr));}//分public static void mergeSort(int[] arr, int left, int right, int[] temp) {if (left < right) {int mid = (left + right) / 2;//中间索引mergeSort(arr, left, mid, temp);//向左递归分解数组mergeSort(arr, mid + 1, right, temp);//向右递归分解数组merge(arr, left, mid, right, temp);//分解完成后将数组进行合并}}//治public static void merge(int[] arr, int left, int mid, int right, int[] temp) {int i = left;//i为指向左边序列第一个元素的索引int j = mid + 1;//j为指向右边序列第一个元素的索引int t = 0;//指向临时temp数组的当前索引//先把左右两边有序数据按规则存入temp数组中,直到有一边的数据全部填充temp中while (i <= mid && j <= right) {if (arr[i] <= arr[j]) {temp[t] = arr[i];t++;i++;} else {temp[t] = arr[j];t++;j++;}}//将有剩余数据的一边全部存入temp中while (i <= mid) {//左边序列有剩余元素temp[t] = arr[i];t++;i++;}while (j <= right) {//右边序列有剩余元素temp[t] = arr[j];t++;j++;}t = 0;int tempLeft = left;while (tempLeft <= right) {arr[tempLeft] = temp[t];t++;tempLeft++;}}
}

感谢您对大饼的支持
今天的你也很辛苦,晚安,明天见

在这里插入图片描述

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

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

相关文章

论文阅读--Cell-free massive MIMO versus small cells

无蜂窝大规模MIMO与小蜂窝网络 论文信息 Ngo H Q, Ashikhmin A, Yang H, et al. Cell-free massive MIMO versus small cells[J]. IEEE Transactions on Wireless Communications, 2017, 16(3): 1834-1850. 无蜂窝大规模MIMO中没有小区或者小区边界的界定&#xff0c;所有接入…

mstp vrrp bfd 实验

LSW1配置 <Huawei>sys Enter system view, return user view with CtrlZ. [Huawei]sys lsw1 [lsw1]vlan batch 10 20 30 [lsw1]int g0/0/1 [lsw1-GigabitEthernet0/0/1]port link-type access [lsw1-GigabitEthernet0/0/1]port default vlan 10 [lsw1-GigabitEthernet0…

基于Springboot实现校园新闻网站管理系统演示【项目源码+论文说明】分享

基于Springboot实现校园新闻网站管理系统演示 摘要 本论文主要论述了如何使用JAVA语言开发一个校园新闻网站 &#xff0c;本系统将严格按照软件开发流程进行各个阶段的工作&#xff0c;采用B/S架构&#xff0c;面向对象编程思想进行项目开发。在引言中&#xff0c;作者将论述校…

新版Ai企业级系统去授权版本完美运行

Ai企联系统去授权版新鲜出炉 一款市面上新出的AI企联系统&#xff0c;一款市面上新出的AI企联系统 项目uniapp开发的&#xff0c;支持3.5 4.0 Mj 此套系统5端适配&#xff0c;WebH5微信小程序抖音小程序双端APP&#xff0c;支持流量主! 好像有能力的快手小程序那些也可以上…

[C++基础]-多态

前言 作者&#xff1a;小蜗牛向前冲 名言&#xff1a;我可以接受失败&#xff0c;但我不能接受放弃 如果觉的博主的文章还不错的话&#xff0c;还请点赞&#xff0c;收藏&#xff0c;关注&#x1f440;支持博主。如果发现有问题的地方欢迎❀大家在评论区指正。 本期学习目标&am…

arm 点灯实验代码以及现象

.text .global _start _start: 1.设置GPIOE寄存器的时钟使能 RCC_MP_AHB4ENSETR[4]->1 0x50000a28 LDR R0,0x50000A28 LDR R1,[R0] ORR R1,R1,#(0x1<<4) 第4位置1 STR R1,[R0] 1.设置GPIOF寄存器的时钟使能 RCC_MP_AHB4ENSETR[4]->1 0x50000a28 LDR R…

Vue中如何进行分布式任务调度与定时任务管理

在Vue中进行分布式任务调度与定时任务管理 分布式任务调度和定时任务管理是许多应用程序中的关键功能之一。它们用于执行周期性的、异步的、重复的任务&#xff0c;例如数据备份、邮件发送、定时报告生成等。在Vue.js应用中&#xff0c;我们可以结合后端服务实现分布式任务调度…

分库分表理论总结

一、概述 分库分表是在面对高并发、海量数量时常见的数据库层面的解决方案。通过把数据分散到不同的数据库中&#xff0c;使得单一数据库的数据量变小来缓解单一数据库的性能问题&#xff0c;从而达到提升数据库性能的目的。比如&#xff1a;将电商数据库拆分为若干独立的数据…

【vue3】wacth监听,监听ref定义的数据,监听reactive定义的数据,详解踩坑点

假期第二篇&#xff0c;对于基础的知识点&#xff0c;我感觉自己还是很薄弱的。 趁着假期&#xff0c;再去复习一遍 之前已经记录了一篇【vue3基础知识点-computed和watch】 今天在学习的过程中发现&#xff0c;之前记录的这一篇果然是很基础的&#xff0c;很多东西都讲的不够…

通信与网络及软件工具的使用心得与记录

在当今的信息时代&#xff0c;通信工程和网络工具已经成为我们工作和生活中不可或缺的一部分。为了更好地利用这些工具&#xff0c;我们需要了解它们的基本原理和使用方法。本文将为您详细介绍一些重要的通信工程和网络工具&#xff0c;以及它们在实际应用中的使用心得和笔记。…

华为数通方向HCIP-DataCom H12-831题库(单选题:201-220)

第201题 DHCP Snooping是一种DHCP安全特性,这项技术可以防御以下哪些攻击? A、DHCP Server仿冒者攻击 B、针对DHCP客户端的畸形报文泛洪攻击 C、仿冒DHCP报文攻击 D、DHCP Server的拒绝服务攻击 答案:ABD 解析: 第202题 两台PE之间通过MP-BGP传播VPNv4路由,以下哪些场景…

三十、【进阶】B树的演变过程

1、索引结构 &#xff08;1&#xff09;二叉树 &#xff08;2&#xff09;B-Tree树 B-Tree树最大度数为5&#xff0c;代表每一个节点最多存储4个key(每个节点最多存储4个数据)&#xff0c;5个指针(可以指向5个子节点)。 2、演变过程&#xff08;最大度数为5&#xff09; &…

基于SpringBoot的社区医院管理系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作…

强化学习------DQN算法

简介 DQN&#xff0c;即深度Q网络&#xff08;Deep Q-network&#xff09;&#xff0c;是指基于深度学习的Q-Learing算法。Q-Learing算法维护一个Q-table&#xff0c;使用表格存储每个状态s下采取动作a获得的奖励&#xff0c;即状态-价值函数Q(s,a)&#xff0c;这种算法存在很…

【LeetCode高频SQL50题-基础版】打卡第3天:第16~20题

文章目录 【LeetCode高频SQL50题-基础版】打卡第3天&#xff1a;第16~20题⛅前言 平均售价&#x1f512;题目&#x1f511;题解 项目员工I&#x1f512;题目&#x1f511;题解 各赛事的用户注册率&#x1f512;题目&#x1f511;题解 查询结果的质量和占比&#x1f512;题目&am…

JDBC介绍

JDBC介绍 JDBC就是使用java语言来操作数据库的一套API&#xff0c;可以操作不同类型的关系性数据库。各种数据库编写自己数据库的驱动来实现JDBC这套接口&#xff0c;从而实现通过java代码来操作不同类型的关系性数据库。各个数据库的驱动jar包就是实现该接口的实现类&#xf…

Mysql 分布式序列算法

接上文 Mysql分库分表 1.分布式序列简介 在分布式系统下&#xff0c;怎么保证ID的生成满足以上需求&#xff1f; ShardingJDBC支持以上两种算法自动生成ID。这里&#xff0c;使用ShardingJDBC让主键ID以雪花算法进行生成&#xff0c;首先配置数据库&#xff0c;因为默认的注…

buuctf PWN warmup_csaw_2016

下载附件&#xff0c;IDA查看 发现直接有显示flag函数 int sub_40060D() {return system("cat flag.txt"); }查看程序起始地址0x40060D ; Attributes: bp-based framesub_40060D proc near ; __unwind { push rbp mov rbp, rsp mov edi, offset comman…

性能监控-微服务链路追踪skywalking搭建

中文文档&#xff1a;hong设置 (skyapm.github.cio) 参考:微服务链路追踪SkyWalking的介绍和部署_skywalking部署_技术闲聊DD的博客-CSDN博客 参考&#xff1a;链路追踪SkyWalking整合项目以及数据持久化_skywalking 持久化_技术闲聊DD的博客-CSDN博客 Liunx部署skywalking以…

如何实现torch.arange的tensor版本

文章目录 背景实现方案不可行的情况 背景 import torch我们都知道&#xff0c;torch.arange只支持数字&#xff0c;不支持tensor&#xff0c;如下&#xff1a; torch.arange(0,5,1)tensor([0, 1, 2, 3, 4]) 但是如果使用tensor&#xff0c;就会报错&#xff1a; torch.arang…