经典排序算法总结

🍓 简介:java系列技术分享(👉持续更新中…🔥)
🍓 初衷:一起学习、一起进步、坚持不懈
🍓 如果文章内容有误与您的想法不一致,欢迎大家在评论区指正🙏
🍓 希望这篇文章对你有所帮助,欢迎点赞 👍 收藏 ⭐留言 📝

🍓 更多文章请点击
在这里插入图片描述在这里插入图片描述

文章目录

  • 一、 冒泡排序
    • 1.1 排序原理
    • 1.2 代码实现
    • 1.3 测试
    • 1.4 时间复杂度分析
  • 二、 选择排序
    • 2.1 排序原理
    • 2.2 代码实现
    • 2.3 排序原理
    • 2.4 时间复杂度分析
  • 三、插入排序
    • 3.1 排序原理
    • 3.2 代码实现
    • 3.3 测试
    • 3.4 时间复杂度分析
  • 四、 希尔排序
    • 4.1 排序原理
    • 4.2 增长量规则
    • 4.3 代码实现
    • 4.4 测试
    • 4.5 时间复杂度分析
  • 五、 归并排序
    • 5.1 排序原理
    • 5.2 代码实现
    • 5.3 测试
    • 5.4 时间复杂度分析
  • 六、 快速排序
    • 6.1 排序原理
    • 6.2 代码实现
    • 6.3 测试
    • 6.4 时间复杂度分析
  • 七、 排序的稳定性

一、 冒泡排序

1.1 排序原理

  1. 比较相邻的元素。如果前一个元素比后一个元素大,就交换这两个元素的位置。
  2. 对每一对相邻元素做同样的工作,从开始第一对元素到结尾的最后一对元素。最终最后位置的元素就是最大值。
    在这里插入图片描述

1.2 代码实现

注释非常清晰,可以参考理解

public class Bubble {/*对数组a中的元素进行排序*/public static void sort(Comparable[] a){//外层循环控制需要剩余排序的数量for(int i=a.length-1;i>0;i--){//内层循环进行判断for(int j=0;j<i;j++){//比较索引j和索引j+1处的值,当前元素大于下一个元素则进行交换if (greater(a[j],a[j+1])){//进行交换exch(a,j,j+1);}}}}/*比较v元素是否大于w元素*/private static  boolean greater(Comparable v,Comparable w){return v.compareTo(w)>0;}/*数组元素i和j交换位置*/private static void exch(Comparable[] a,int i,int j){Comparable temp;temp = a[i];a[i]=a[j];a[j]=temp;}
}

1.3 测试

public class BubbleTest {public static void main(String[] args) {Integer[] arr = {4,5,6,3,2,1};Bubble.sort(arr);System.out.println(Arrays.toString(arr));}}

在这里插入图片描述

1.4 时间复杂度分析

冒泡排序使用了双层for循环,其中内层循环的循环体是真正完成排序的代码,所以,我们分析冒泡排序的时间复杂度,主要分析一下内层循环体的执行次数即可。

在最坏情况下,也就是假如要排序的元素为{6,5,4,3,2,1}逆序,那么:
元素比较的次数为:

​ (N-1)+(N-2)+(N-3)+…+2+1=((N-1)+1)*(N-1)/2=N^2/2-N/2;

元素交换的次数为:

​ (N-1)+(N-2)+(N-3)+…+2+1=((N-1)+1)*(N-1)/2=N^2/2-N/2;

总执行次数为:

​ (N2/2-N/2)+(N2/2-N/2)=N^2-N;

按照大O推导法则,保留函数中的最高阶项那么最终冒泡排序的时间复杂度为O(N^2)

二、 选择排序

2.1 排序原理

​1. 每一次遍历的过程中,都假定第一个索引处的元素是最小值,和其他索引处的值依次进行比较,如果当前索引处的值大于其他某个索引处的值,则假定其他某个索引出的值为最小值,最后可以找到最小值所在的索引
​2. 交换第一个索引处和最小值所在的索引处的值
在这里插入图片描述

2.2 代码实现

public class Selection {/*** 对数组a中的元素进行排序*/public static void sort(Comparable[] a){//外层循环中【-2】是因为排序如果只剩最后一个,那么也无需排序for(int i=0;i<=a.length-2;i++){//定义一个变量,记录最小元素所在的索引,默认为参与选择排序的第一个元素所在的位置int minIndex = i;//因此默认排序的索引从【i+1】开始for(int j=i+1;j<a.length;j++){//需要比较最小索引minIndex处的值和j索引处的值;if (greater(a[minIndex],a[j])){minIndex=j;}}//交换最小元素所在索引minIndex处的值和索引i处的值exch(a,i,minIndex);}}/*比较v元素是否大于w元素*/private static  boolean greater(Comparable v,Comparable w){return v.compareTo(w)>0;}/*数组元素i和j交换位置*/private static void exch(Comparable[] a,int i,int j){Comparable temp;temp = a[i];a[i]=a[j];a[j]=temp;}
}

2.3 排序原理

public class SelectionTest {public static void main(String[] args) {//原始数据Integer[] a = {4,6,8,7,9,2,10,1};Selection.sort(a);System.out.println(Arrays.toString(a));//{1,2,4,5,7,8,9,10}}
}

在这里插入图片描述

2.4 时间复杂度分析

选择排序使用了双层for循环,其中外层循环完成了数据交换,内层循环完成了数据比较,所以我们分别统计数据交换次数和数据比较次数:

数据比较次数:
​ (N-1)+(N-2)+(N-3)+…+2+1=((N-1)+1)*(N-1)/2=N^2/2-N/2;
数据交换次数:
​ N-1
时间复杂度:N2/2-N/2+(N-1)=N2/2+N/2-1;

根据大O推导法则,保留最高阶项,去除常数因子,时间复杂度为O(N^2)

三、插入排序

3.1 排序原理

  1. 把所有的元素分为两组,已经排序的和未排序的;

  2. 找到未排序的组中的第一个元素,向已经排序的组中进行插入

  3. 倒叙遍历已经排序的元素,依次和待插入的元素进行比较,直到找到一个元素小于等于待插入元素,那么就把待插入元素放到这个位置,其他的元素向后移动一位;

在这里插入图片描述
在这里插入图片描述

3.2 代码实现

public class Insertion {/*对数组a中的元素进行排序*/public static void sort(Comparable[] a){//因为0索引处的第一个元素默认已排序,所以需要排序的元素索引从1开始for(int i=1;i<a.length;i++){for(int j=i;j>0;j--){//比较索引j处的值和索引j-1处的值,如果索引j-1处的值比索引j处的值大,则交换数据,如果不大,那么就找到合适的位置了,退出循环即可;if (greater(a[j-1],a[j])){exch(a,j-1,j);}else{break;}}}}/*比较v元素是否大于w元素*/private static  boolean greater(Comparable v,Comparable w){return v.compareTo(w)>0;}/*数组元素i和j交换位置*/private static void exch(Comparable[] a,int i,int j){Comparable temp;temp = a[i];a[i]=a[j];a[j]=temp;}
}

3.3 测试

public class InsertionTest {public static void main(String[] args) {Integer[] a = {4,3,2,10,12,1,5,6};Insertion.sort(a);System.out.println(Arrays.toString(a));//{1,2,3,4,5,6,10,12}}
}

在这里插入图片描述

3.4 时间复杂度分析

插入排序使用了双层for循环,其中内层循环的循环体是真正完成排序的代码,所以,我们分析插入排序的时间复杂度,主要分析一下内层循环体的执行次数即可。

最坏情况,也就是待排序的数组元素为{12,10,6,5,4,3,2,1},那么:

​ 比较的次数为:

​ (N-1)+(N-2)+(N-3)+…+2+1=((N-1)+1)*(N-1)/2=N^2/2-N/2;

​ 交换的次数为:

​ (N-1)+(N-2)+(N-3)+…+2+1=((N-1)+1)*(N-1)/2=N^2/2-N/2;

​ 总执行次数为:

​ (N2/2-N/2)+(N2/2-N/2)=N^2-N;

按照大O推导法则,保留函数中的最高阶项那么最终插入排序的时间复杂度为O(N^2)

四、 希尔排序

希尔排序是插入排序的一种,又称 缩小增量排序 ,是 插入排序 \color{#0AF}{插入排序} 插入排序算法的一种更高效的改进版本

4.1 排序原理

​1. 选定一个增长量h,按照增长量h作为数据分组的依据,对数据进行分组
​2. 对分好组的每一组数据完成插入排序
​3. 减小增长量,最小减为1,重复第二步操作

在这里插入图片描述

4.2 增长量规则

//循环结束后我们就可以确定h的最大值;
int h=1
while(h<5){h=2h+1}h的减小规则为:h=h/2

4.3 代码实现

public class Shell {/*对数组a中的元素进行排序*/public static void sort(Comparable[] a){//1.根据数组a的长度,确定增长量h的初始值;int h = 1;while(h<a.length/2){h=2*h+1;}//2.希尔排序while(h>=1){//排序//2.1.找到待插入的元素for (int i=h;i<a.length;i++){//2.2把待插入的元素插入到有序数列中for (int j=i;j>=h;j-=h){//待插入的元素是a[j],比较a[j]和a[j-h]if (greater(a[j-h],a[j])){//交换元素exch(a,j-h,j);}else{//待插入元素已经找到了合适的位置,结束循环;break;}}}//减小h的值h= h/2;}}/*比较v元素是否大于w元素*/private static  boolean greater(Comparable v,Comparable w){return v.compareTo(w)>0;}/*数组元素i和j交换位置*/private static void exch(Comparable[] a,int i,int j){Comparable temp;temp = a[i];a[i]=a[j];a[j]=temp;}
}

4.4 测试

public class ShellTest {public static void main(String[] args) {Integer[] a = {9,1,2,5,7,4,8,6,3,5};Shell.sort(a);System.out.println(Arrays.toString(a));//{1,2,3,4,5,5,6,7,8,9}}
}

在这里插入图片描述

4.5 时间复杂度分析

  • 在希尔排序中,增长量h并没有固定的规则,有很多论文研究了各种不同的递增序列,但都无法证明某个序列是最好的
  • 我们可以使用事后分析法对希尔排序和插入排序做性能比较。
  • 通过测试发现,在处理大批量数据时,希尔排序的性能确实高于插入排序

五、 归并排序

归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。

5.1 排序原理

  1. 尽可能的一组数据拆分成两个元素相等的子组,并对每一个子组继续拆分,直到拆分后的每个子组的元素个数是1为止。
  2. 将相邻的两个子组进行合并成一个有序的大组;
  3. 不断的重复步骤2,直到最终只有一个组为止。
    在这里插入图片描述归并原理:
    在这里插入图片描述
    在这里插入图片描述在这里插入图片描述在这里插入图片描述

5.2 代码实现

public class Merge {//归并所需要的辅助数组private static Comparable[] assist;/*比较v元素是否小于w元素*/private static boolean less(Comparable v, Comparable w) {return v.compareTo(w)<0;}/*数组元素i和j交换位置*/private static void exch(Comparable[] a, int i, int j) {Comparable t = a[i];a[i] = a[j];a[j] = t;}/*对数组a中的元素进行排序*/public static void sort(Comparable[] a) {//1.初始化辅助数组assist;assist = new Comparable[a.length];//2.定义一个lo变量,和hi变量,分别记录数组中最小的索引和最大的索引;int lo=0;int hi=a.length-1;//3.调用sort重载方法完成数组a中,从索引lo到索引hi的元素的排序sort(a,lo,hi);}/*对数组a中从lo到hi的元素进行排序*/private static void sort(Comparable[] a, int lo, int hi) {//做安全性校验;if (hi<=lo){return;}//对lo到hi之间的数据进行分为两个组int mid = lo+(hi-lo)/2;//   5,9  mid=7//分别对每一组数据进行排序sort(a,lo,mid);sort(a,mid+1,hi);//再把两个组中的数据进行归并merge(a,lo,mid,hi);}/*对数组中,从lo到mid为一组,从mid+1到hi为一组,对这两组数据进行归并*/private static void merge(Comparable[] a, int lo, int mid, int hi) {//定义三个指针int i=lo;int p1=lo;int p2=mid+1;//遍历,移动p1指针和p2指针,比较对应索引处的值,找出小的那个,放到辅助数组的对应索引处while(p1<=mid && p2<=hi){//比较对应索引处的值if (less(a[p1],a[p2])){assist[i++] = a[p1++];}else{assist[i++]=a[p2++];}}//遍历,如果p1的指针没有走完,那么顺序移动p1指针,把对应的元素放到辅助数组的对应索引处while(p1<=mid){assist[i++]=a[p1++];}//遍历,如果p2的指针没有走完,那么顺序移动p2指针,把对应的元素放到辅助数组的对应索引处while(p2<=hi){assist[i++]=a[p2++];}//把辅助数组中的元素拷贝到原数组中for(int index=lo;index<=hi;index++){a[index]=assist[index];}}}

5.3 测试

public class MergeTest {public static void main(String[] args) {Integer[] a = {8,4,5,7,1,3,6,2};Merge.sort(a);System.out.println(Arrays.toString(a));//{1,2,3,4,5,6,7,8}}
}

在这里插入图片描述

5.4 时间复杂度分析

最终得出的归并排序的时间复杂度为:log2(n)* 2^(log2(n))=log2(n)*n
根据大O推导法则,忽略底数,最终归并排序的时间复杂度为O(nlogn)

缺点:

  • 需要申请额外的数组空间,导致空间复杂度提升,是典型的以空间换时间的操作。

通过测试,发现希尔排序和归并排序在处理大批量数据时差别不是很大

六、 快速排序

6.1 排序原理

  1. 首先设定一个分界值,通过该分界值将数组分成左右两部分;

  2. 将大于或等于分界值的数据放到到数组右边,小于分界值的数据放到数组的左边。此时左边部分中各元素都小于或等于分界值,而右边部分中各元素都大于或等于分界值;

  3. 然后,左边和右边的数据可以独立排序。对于左侧的数组数据,又可以取一个分界值,将该部分数据分成左右两部分,同样在左边放置较小值,右边放置较大值。右侧的数组数据也可以做类似处理。

  4. 重复上述过程,可以看出,这是一个递归定义。通过递归将左侧部分排好序后,再递归排好右侧部分的顺序。当左侧和右侧两个部分的数据排完序后,整个数组的排序也就完成了。

切分原理:
5. 找一个基准值,用两个指针分别指向数组的头部和尾部;

  1. 先从尾部向头部开始搜索一个比基准值小的元素,搜索到即停止,并记录指针的位置;

  2. 再从头部向尾部开始搜索一个比基准值大的元素,搜索到即停止,并记录指针的位置;

  3. 交换当前左边指针位置和右边指针位置的元素;

  4. 重复2,3,4步骤,直到左边指针的值大于右边指针的值停止。

  5. 当两个指针相遇时,该索引处值与基准值交换

在这里插入图片描述

无法理解可以看这篇文章对快速排序讲解非常细致:快速排序

6.2 代码实现

public class Quick {/*比较v元素是否小于w元素*/private static boolean less(Comparable v, Comparable w) {return v.compareTo(w) < 0;}/*数组元素i和j交换位置*/private static void exch(Comparable[] a, int i, int j) {Comparable t = a[i];a[i] = a[j];a[j] = t;}//对数组内的元素进行排序public static void sort(Comparable[] a) {int lo = 0;int hi = a.length-1;sort(a,lo,hi);}//对数组a中从索引lo到索引hi之间的元素进行排序private static void sort(Comparable[] a, int lo, int hi) {//安全性校验if (hi<=lo){return;}//需要对数组中lo索引到hi索引处的元素进行分组(左子组和右子组);int partition = partition(a, lo, hi);//返回的是分组的分界值所在的索引,分界值位置变换后的索引//让左子组有序sort(a,lo,partition-1);//让右子组有序sort(a,partition+1,hi);}//对数组a中,从索引 lo到索引 hi之间的元素进行分组,并返回分组界限对应的索引public static int partition(Comparable[] a, int lo, int hi) {//确定分界值Comparable key = a[lo];//定义两个指针,分别指向待切分元素的最小索引处和最大索引处的下一个位置int left=lo;int right=hi+1;//切分while(true){//先从右往左扫描,移动right指针,找到一个比分界值小的元素,停止while(less(key,a[--right])){if (right==lo){break;}}//再从左往右扫描,移动left指针,找到一个比分界值大的元素,停止while(less(a[++left],key)){if (left==hi){break;}}//判断 left>=right,如果是,则证明元素扫描完毕,结束循环,如果不是,则交换元素即可if (left>=right){break;}else{exch(a,left,right);}}//交换分界值exch(a,lo,right);return right;}}

6.3 测试

public class QuickTest {public static void main(String[] args) {Integer[] a= {6, 1, 2, 7, 9, 3, 4, 5, 8};Quick.sort(a);System.out.println(Arrays.toString(a));//{1, 2, 3, 4, 5, 6, 7, 8, 9}}
}

在这里插入图片描述

6.4 时间复杂度分析

  • 因此快速排序的最差时间复杂度和冒泡排序是一样的都是 O ( n^2^ )
  • 它的平均时间复杂度为 O ( n log ⁡~2~ n )

七、 排序的稳定性

数组arr中有若干元素,其中A元素和B元素相等,并且A元素在B元素前面,如果使用某种排序算法排序后,能够保证A元素依然在B元素的前面,可以说这个该算法是稳定的。

如果一组数据只需要一次排序,则稳定性一般是没有意义的,如果一组数据需要多次排序,稳定性是有意义的。例如要排序的内容是一组商品对象,第一次排序按照价格由低到高排序第二次排序按照销量由高到低排序,如果第二次排序使用稳定性算法,就可以使得相同销量的对象依旧保持着价格高低的顺序展现,只有销量不同的对象才需要重新排序。这样既可以保持第一次排序的原有意义,而且可以减少系统开销。

在这里插入图片描述 冒泡排序 \color{#0AF}{冒泡排序} 冒泡排序
​只有当arr[i]>arr[i+1]的时候才会交换元素的位置而相等的时候并不交换位置,所以冒泡排序是一种稳定排序算法。

选择排序 \color{#0AF}{选择排序} 选择排序
​ 选择排序是给每个位置选择当前元素最小的,例如有数据{5(1),8 ,5(2), 2, 9 },第一遍选择到的最小元素为2,所以5(1)会和2进行交换位置,此时5(1)到了5(2)后面,破坏了稳定性,所以选择排序是一种不稳定的排序算法。

插入排序 \color{#0AF}{插入排序} 插入排序
​ 比较是从有序序列的末尾开始,也就是想要插入的元素和已经有序的最大者开始比起,如果比它大则直接插入在其后面,否则一直往前找直到找到它该插入的位置。如果碰见一个和插入元素相等的,那么把要插入的元素放在相等元素的后面。所以,相等元素的前后顺序没有改变,从原无序序列出去的顺序就是排好序后的顺序,所以插入排序是稳定

希尔排序 \color{#0AF}{希尔排序} 希尔排序
​ 希尔排序是按照不同步长对元素进行插入排序 ,虽然一次插入排序是稳定的,不会改变相同元素的相对顺序,但在不同的插入排序过程中,相同的元素可能在各自的插入排序中移动,最后其稳定性就会被打乱,所以希尔排序是不稳定的。

归并排序 \color{#0AF}{归并排序} 归并排序
​ 归并排序在归并的过程中,只有arr[i]<arr[i+1]的时候才会交换位置,如果两个元素相等则不会交换位置,所以它并不会破坏稳定性,归并排序是稳定的。

快速排序 \color{#0AF}{快速排序} 快速排序
​ 快速排序需要一个基准值,在基准值的右侧找一个比基准值小的元素,在基准值的左侧找一个比基准值大的元素,然后交换这两个元素,此时会破坏稳定性,所以快速排序是一种不稳定的算法。

在这里插入图片描述在这里插入图片描述

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

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

相关文章

深入理解JVM虚拟机第四篇:一些常用的JVM虚拟机

一&#xff1a;Sun Classic VM虚拟机 早在1996年Java1.0版本的时候&#xff0c;Sun公司发布了一款名为Sun classic VM的Java虚拟机&#xff0c;它同时也是世界上第一款商用Java虚拟机&#xff0c;JDK1.4时完全被淘汰。 现在hotspot内置了此虚拟机。 这款虚拟机内部只提供解释器…

银行笔试篇---职业能力测试(行测)

数字推理 数字推理可分为等差数列、等比数列、和数列、积数列、幂数列以及分数数列六类&#xff0c;做题时的总体原则为&#xff1a; 关键点1&#xff1a;凡是一次变化找不到规律的&#xff0c;直接放弃&#xff01;所谓一次变化指的是&#xff1a;1.通过一次相邻两数作差、作…

【数据库】Navicate运行数据区sql文件 1046 no database selected

文章目录 前言一、现象二、解决 前言 要通过Navicat导入数据库文件&#xff0c;但是不成功报错1046 no database selected 一、现象 选中已经建立的连接&#xff0c;右键运行sql文件&#xff0c;报错 二、解决 1、先在建立的localhost中右键建立和要导入数据库同名的数据…

C++信息学奥赛1170:计算2的N次方

#include <iostream> #include <string> #include <cstring>using namespace std;int main() {int n;cin >> n; // 输入一个整数nint arr[100];memset(arr, -1, sizeof(arr)); // 将数组arr的元素初始化为-1&#xff0c;sizeof(arr)表示arr数组的字节…

【STM32】影子寄存器

不可操作但是真正起作用的寄存器是影子寄存器 定时器框图中&#xff0c;有些寄存器下有个阴影 这些阴影的表示这些寄存器存在影子寄存器。 图中也有对这些影子的说明&#xff0c;在U事件时传送预装载寄存器至实际寄存器。 有阴影的寄存器(AutoReloadRegister)&#xff0c;表…

数据库管理软件NoSQLBooster for MongoDB 8.1 Mac

NoSQLBooster for MongoDB 是一款功能强大的 MongoDB 数据库管理工具。它提供了一个直观的用户界面&#xff0c;使用户能够轻松地浏览、查询和修改 MongoDB 数据库中的数据。 NoSQLBooster for MongoDB 支持多种查询方式&#xff0c;包括基本查询、聚合管道、地理空间查询等。它…

Python解析MDX词典数据并保存到Excel

原始数据和处理结果&#xff1a; https://gitcode.net/as604049322/blog_data/-/tree/master/mdx 下载help.mdx词典后&#xff0c;我们无法直接查看&#xff0c;我们可以使用readmdict库来完成对mdx文件的读取。 安装库&#xff1a; pip install readmdict对于Windows平台还…

【建站教程】使用阿里云服务器怎么搭建网站?

使用阿里云服务器快速搭建网站教程&#xff0c;先为云服务器安装宝塔面板&#xff0c;然后在宝塔面板上新建站点&#xff0c;阿里云服务器网以搭建WordPress网站博客为例&#xff0c;阿小云来详细说下从阿里云服务器CPU内存配置选择、Web环境、域名解析到网站上线全流程&#x…

绝热量热法反应热测试过程中的温度和压力自动跟踪控制解决方案

摘要&#xff1a;现有的ARC加速量热仪普遍存在单热电偶温差测量误差大造成绝热效果不好&#xff0c;以及样品球较大壁厚造成热惰性因子较大&#xff0c;都使得ARC测量精度不高。为此本文提出了技术改进解决方案&#xff0c;一是采用多只热电偶组成的温差热电堆进行温差测量&…

ChatGPT提示词(prompt)资源汇总

文章目录 awesome-chatgpt-promptsLearn PromptingSnack PromptFlow GPTPrompt VineChatGPT 指令大全AI Toolbox HubAI Short ChatGPT是一种强大的生成式AI模型&#xff0c;而提示词&#xff08;prompt&#xff09;则是与ChatGPT一起使用的指导性文本&#xff0c;用于引导模型生…

R语言并行计算提高速度丨parallel包和foreach包

并行计算提高R语言速度 今天与大家分享的是R语言中的并行计算的内容&#xff0c;将探讨如何使用parallel和foreach包在R中进行并行计算&#xff0c;以及在不同情况下提高计算效率的方法。 目标&#xff1a;让计算等待时间缩短&#xff01; 1. 什么是并行计算&#xff1f; 并行计…

《Linkerd 2.0:下一代服务网格的探索》

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f405;&#x1f43e;猫头虎建议程序员必备技术栈一览表&#x1f4d6;&#xff1a; &#x1f6e0;️ 全栈技术 Full Stack: &#x1f4da…

数据结构——排序算法——插入排序

交换法插入排序 void swap(vector<int> arr, int i, int j) {int temp arr[i];arr[i] arr[j];arr[j] temp;}void insertSort(vector<int> arr) {// 从第二个数开始&#xff0c;往前插入数字for (int i 1; i < arr.size(); i) {// j 记录当前数字下标int j …

WPS或EXCEL表格单元格下拉快捷选择项修改及设置方法

WPS或新版本EXCEL的设置下拉选项的方法是.点击一个单元格,菜单上选择数据,下拉列表即可设置,双击文字可编辑 EXCEL 旧的版本不同,可能有不同方法 方法一, 1.在空白区域里面&#xff0c;准备好需要填入下拉菜单里面的内容。 2.选中一个需要添加下拉菜单的单元格&#xff0c;然后…

Linux编辑器-vim使用

文章目录 前言一、vim编辑器1、vim的基本概念2、vim的基本操作2.1 命令模式切换至插入模式2.2 插入模式切换至命令模式2.3 命令模式切换至底行模式 3、vim命令模式命令集3.1 移动光标3.2 删除文字3.3 复制与粘贴3.4 替换3.5 撤销上一次操作3.6 更改3.7 跳至指定的行 4、vim末行…

论文浅尝 | 思维树:使用大语言模型反复思考解决问题

笔记整理&#xff1a;许泽众&#xff0c;浙江大学博士&#xff0c;研究方向为知识图谱上的神经符号推理 链接&#xff1a;https://arxiv.org/abs/2305.10601 1. 动机 语言模型是一种强大的工具&#xff0c;可以用于各种需要数学、符号、常识或知识推理的任务。然而&#xff0c;…

请体验一下falcon 180b 大语言模型的感觉

引言 由Technology Innovation Institute(T四训练的开源大模型Falcon 180B登陆Hugging Face!Falcon180B为开源大模型树立了全新的标杆。作为当前最大的开源大模型&#xff0c;有l80B参数并且是在在3.5万亿token的TII RefinedWeb数据集上进行训练&#xff0c;这也是目前…

列表和字典练习

定义四个学生信息 在Python环境下&#xff0c;用列表定义&#xff1a; >>> stu1[xiaoming,True,21,79.9] >>> stu1[lihong,False,22,69.9] >>> stu1[zhangqiang,True,20,89.9] >>> stu1[EMT,True,23,99.9]如图&#xff0c;定义了四个列表…

Redis高效、安全的不停机数据迁移方案

Redis是目前最流行的键值对存储数据库&#xff0c;凭借高性能和丰富的数据类型的特性&#xff0c;不仅可以作为缓存&#xff0c;还可以作为一个可持久化的数据库存储。随着业务的发展和版本的迭代&#xff0c;必然会遇到内存不足、集群节点不够和BUG等一系列问题。为了防止这些…

深入理解JVM虚拟机第三篇:JVM的指令集架构模型和JVM的生命周期

文章目录 一&#xff1a;JVM的指令集架构模型 1&#xff1a;基于栈式架构的特点 (1)&#xff1a;什么叫零地址指令、一地址指令、二地址指令、三地址指令&#xff1f; (2)&#xff1a;为什么说不需要硬件支持&#xff0c;可移植性好&#xff1f; 2&#xff1a;基于寄存…