七大排序算法

文章目录

    • 排序的概念及引用
    • 1.插入排序
    • 2.希尔排序(缩小增量排序)
    • 3.选择排序
    • 4.堆排序
    • 5.冒泡排序
    • 6.快速排序
    • 7.归并排序
    • 8.代码排序部分的测试
    • 9.代码加效果大致测试时间(仅供参考)

排序的概念及引用

排序:将数据按照特定的规律排成递增或递减的操作

稳定性:例如arr数组中arr[i]==arr[i+1]但在排序后arr[i+1]排在arr[i]前面了则是不稳定的反之稳定

已下方法都是按照递增排序的。
swap方法(交换)代码:

private static void swap(int []arr,int ret1,int ret2){int temp=arr[ret1];arr[ret1]=arr[ret2];arr[ret2]=temp;}

在这里插入图片描述

1.插入排序

基本思路将指定的数插入到了原本已经有序的数组中,直到数组全部有序。
在此写了两种方法,变化不大。

 public static void paixu1(int arr[]){for(int i=1;i<arr.length;i++){int temp=arr[i];for ( int j=i-1;j>=0;j--){if(arr[j]>temp){//直接插入到arr[j]位置arr[j+1]=arr[j];arr[j]=temp;}else {break;}}}}
public static void paixu2(int arr[]){for(int i=1;i<arr.length;i++){int temp=arr[i];int j=i-1;for (;j>=0;j--){if(arr[j]>temp){arr[j+1]=arr[j];//找到temp的正确位置}else {break;}}arr[j+1]=temp;//找到后再插入}}

插入排序:时间复杂度为O(n~n^2);空间复杂度为O(1);稳定

2.希尔排序(缩小增量排序)

基本思路:将数组分为gap小组进行排序,直到gap为1该数组就完成了排序,使用的底层排序逻辑就是在插入排序的基础下优化。
在这里插入图片描述
代码:

public static void haset(int arr[]) {int gap = arr.length;while (gap >1) {gap /= 2;hpa(arr,gap);}}private  static void hpa(int arr[],int gap){for(int i=1;i<arr.length;i++){int temp=arr[i];int j=i-gap;for (;j>=0;j-=gap){if(arr[j]>temp){arr[j+gap]=arr[j];}else {break;}}arr[j+gap]=temp;}}

希尔排序:时间复杂度为O(n~n^2);空间复杂度为O(1);不稳定

3.选择排序

基本思路:在需要排序的数据中找出最大或最小的值放在特定位置后面按照这样继续遍历数组直至数组遍历完成。

 public static void xtion1(int arr[]){for (int i=0;i< arr.length;i++){int temp=i;for (int j=i+1;j< arr.length;j++){if(arr[j]<arr[temp]) {temp= j;}}if(arr[temp]<arr[i]){swap(arr,i,temp);}}}

在此基础上可以进行优化一次性找出最大和最小

  public static void xtion2(int arr[]){int left=0;int right=arr.length-1;while(left<right){int minindex= left;int maxindex=left;//用maxindex=right就需要去套两个for循环增加运行时间for(int i=left+1;i<=right;i++){if(arr[i]<arr[minindex]){minindex=i;}if(arr[i]>arr[maxindex]){maxindex=i;}}swap(arr,left,minindex);//注意第一个数是最大值就需要特殊处理防止刚换过的最小又去换去最大值的位置这个逻辑就直接崩了if(left==maxindex){maxindex=minindex;}swap(arr,right,maxindex);left++;right--;}}

选择排序:时间复杂度为O(n^2);空间复杂度为O(1);不稳定

4.堆排序

基本思路:运用堆的性质排序。
我们需要的是递增排序所以使用大堆然后交换0下标与end下标进行end–再进行向下调整。
在这里插入图片描述

代码:

 public static void duipa(int []arr){int end= arr.length-1;dadui(arr,end);//构建堆的过程可以使用xiato方法代替可以节省大量时间消耗(才符合时间复杂度O(n*logn)),这里就直接展示如何构建堆的过程了while (end>0){swap(arr,0,end);//只需要向下调整end--;xiato(arr,end);}}private  static void xiato(int[]arr,int end) {int parten=0;int childer = parten * 2 + 1;while (childer <= end) {if (childer + 1 <= end&& arr[childer] < arr[childer + 1]) {childer++;}if (arr[parten] < arr[childer]) {swap(arr, parten, childer);parten = childer;childer = parten * 2 + 1;} else {break;}}}private static void swap(int[]arr,int ret1,int ret2){int temp=arr[ret2];arr[ret2]=arr[ret1];arr[ret1]=temp;}private static void dadui(int []arr,int end){int usize= end;for (int parten=(usize-1)/2;parten>=0;parten--){int childer=parten*2+1;while(childer<=usize){if(childer+1<=usize&&arr[childer]<arr[childer+1]){childer++;}if(arr[parten]<arr[childer]){swap(arr,parten,childer);parten=childer;childer=parten*2+1;}else{break;}}}}

堆排序:时间复杂度为O(n*logn);空间复杂度为O(1);不稳定

5.冒泡排序

基本思路:基于指定数据与其余数据相比进行交换。
代码:

  public static void mppx(int []arr){for (int i = 0; i <arr.length ; i++) {for (int j = 0; j< arr.length-1-i; j++) {//一次次确定最大值if(arr[j]>arr[j+1]){swap(arr,j,j+1);}}}}
在此基础上进行优化,优化的思路为当数组已经排好了就可以直接退出循环减少时间的消耗。
优化代码:```javapublic static void mppx(int []arr){for (int i = 0; i <arr.length ; i++) {boolean flag=false;//作为标记是否有进行交换for (int j = 0; j< arr.length-1-i; j++) {//一次次确定最小值if(arr[j]>arr[j+1]){swap(arr,j,j+1);flag=true;}}if(!flag){//说明没有进入第二层循环却没有进行交换代表已经排好了break;}}}

冒泡排序:时间复杂度为O(n^2);空间复杂度为O(1);稳定

6.快速排序

快速排序是Hoare于1962年提出的⼀种⼆叉树结构的交换排序⽅法,其基本思想为:任取待排序元素序列中的某元素作为基准值,按照该排序码将待排序集合分割成两⼦序列,左⼦序列中所有元素均⼩于基准值,右⼦序列中所有元素均⼤于基准值,然后最左右⼦序列重复该过程,直到所有元素都排列在相应位置上为⽌。
三种不同方法:Hoare版,挖坑法,前后指针法。

cent方法是便于找到了数组的中位数去大大优化代码的时间消耗,当第一次就找到中间值去分割是优解所以创建cent方法去找去中位数。

private static int cent(int []arr,int start,int end){//找中位数的下标int mid=(start+end)/2;if(arr[start]<arr[end]){if(arr[mid]<arr[start]){return start;}if(arr[mid]>arr[end]){return end;}else{return mid;}}else {if(arr[mid]>arr[start]){return start;}if(arr[mid]<arr[end]){return end;}else{return mid;}}}

Hoare:分为递归与非递归
代码1递归:
去注意为什么利用递归和什么时候需要递归的跑代码和递归结束的条件能更好的理解。

 public static void quikpai(int[]arr){quik(arr,0, arr.length-1);}
private static void quik(int[]arr,int start,int end){if(start>=end){//注意递归结束的条件return;}swap(arr,start,cent(arr,start,end));int cent=quike(arr,start,end);quik(arr,start,cent-1);quik(arr,cent+1,end);}//作用于找到了指定值的下标而且将其中分为小于和大于指定值的左右两边private static int quike(int []arr,int start,int end){int cent=start;while(start<end){while (start<end&&arr[end]>=arr[cent]){end--;}while (start<end&&arr[start]<=arr[cent]){start++;}swap(arr,start,end);}swap(arr,cent,start);return start;}

代码2非递归:
变动的是quik方法

  public static void quikpai1(int[]arr){quik1(arr,0, arr.length-1);}private static void quik1(int[]arr,int start,int end){//不使用递归去快排swap(arr,start,cent(arr,start,end));int cent=quike(arr,start,end);Stack<Integer> stack=new Stack<>();if(cent>start+1){stack.push(start);stack.push(cent-1);}if(cent<end-1){stack.push(cent+1);stack.push(end);}end=stack.pop();start=stack.pop();cent=quike(arr,start,end);while (!stack.isEmpty()){if(cent>start+1){stack.push(start);stack.push(cent-1);}if(cent<end-1){stack.push(cent+1);stack.push(end);}end=stack.pop();start=stack.pop();cent=quike(arr,start,end);}}private static int quike(int []arr,int start,int end){int cent=start;while(start<end){while (start<end&&arr[end]>=arr[cent]){end--;}while (start<end&&arr[start]<=arr[cent]){start++;}swap(arr,start,end);}swap(arr,cent,start);return start;}

挖坑法:
基本思路与Hoare相似,将指定数据下标挖坑;先从end开始向后找到小于指定值的数填入坑中这个坑就是被找到这个值代替了再从start开始向前找到大于指定值的数填入后面的这个新坑中,最后start>=end时再将指定值填入这个坑(数组下标)中。
代码:

public static void wquikpai(int []arr){wquik(arr,0, arr.length-1);}private static void wquik(int[]arr,int start,int end){if(start>=end){return;}int cent=wquike(arr,start,end);wquik(arr,start,cent-1);wquik(arr,cent+1,end);}private  static int wquike(int []arr,int start,int end){int cent=start;int paiv=arr[start];while(start<end){while (start<end&&arr[end]>=paiv){end--;}arr[start]=arr[end];while (start<end&&arr[start]<=arr[cent]){start++;}arr[end]=arr[start];}arr[start]=paiv;return start;}

前后指针法
基本思路:int pavi=start ,int cur=start+1 去根据特定条件去使pavi下标停在第一个出现大于arr[start]的下标上而cur停在pavi停好后出现的第一个小于arr[start]的下标上然后两者进行交换,当cur>arr.length()-1结束。

  public static void shuang(int []arr){wshuang(arr,0,arr.length-1);}private static void wshuang(int []arr,int start,int end){if(start>end){return;}int ret=wshuange(arr,start,end);wshuang(arr,0,ret-1);wshuang(arr,ret+1,end);}private static int wshuange(int[]arr,int start,int end){int pavi=start;int cur=start+1;while (cur<=end){if(arr[cur]<arr[start]&&arr[++pavi]!=arr[cur]){//这里是关键swap(arr,pavi,cur);}cur++;}//pavi停的位置就是arr[start]的位置;swap(arr,pavi,start);return pavi;}

快速排序的时间复杂度为O(n*logn);空间复杂度为O(logn),不稳定

7.归并排序

基本思路:将数组一直对半分直至数据一个个,在将其两两排序结合,直至整个数组排好。将已有序的⼦序列合并,得到完全有序的序列;即先使每个⼦序列有序,再使⼦序列段间有序。若将两个有序表合并成⼀个有序表,称为⼆路归并
在这里插入图片描述

递归方式代码:

 public static void  merg(int []arr){mergsort(arr,0,arr.length-1);}private static void mergsort(int []arr,int start,int end){if(start==end){return;}int mid=(start+end)/2;mergsort(arr,start,mid);mergsort(arr,mid+1,end);merghebin(arr,start,end,mid);}private static void merghebin(int []arr,int start,int end,int mid){int se=start;int sl=mid;int te=mid+1;int tl=end;int []temparr=new int[end-start+1];int k=0;//表示temparr的下标while (se<=sl&&te<=tl){if(arr[se]<=arr[te]){temparr[k++]=arr[se++];}else {temparr[k++]=arr[te++];}}while (se<=sl){temparr[k++]=arr[se++];}while (te<=tl){temparr[k++]=arr[te++];}for(int i=0;i<end-start+1;i++){arr[i+start]=temparr[i];}}
非递归代码:
public static void merg1(int[]arr){mergsort1(arr,0,arr.length-1);
}
public static void mergsort1(int[]arr,int start,int end){//采用非递归的方式int gap=1;while (gap<arr.length) {for (int i = 0; i < arr.length; i += 2 * gap) {int left = i;int mid = left + gap - 1;int right = mid + gap;if(mid>=arr.length){mid=arr.length-1;}if(right>=arr.length){right=arr.length-1;}merghebin(arr, left,right,mid);}gap *= 2;}
}
private static void merghebin(int []arr,int start,int end,int mid){int se=start;int sl=mid;int te=mid+1;int tl=end;int []temparr=new int[end-start+1];int k=0;//表示temparr的下标while (se<=sl&&te<=tl){if(arr[se]<=arr[te]){temparr[k++]=arr[se++];}else {temparr[k++]=arr[te++];}}while (se<=sl){temparr[k++]=arr[se++];}while (te<=tl){temparr[k++]=arr[te++];}for(int i=0;i<end-start+1;i++){arr[i+start]=temparr[i];}
}

归并排序时间复杂度为O(n*logn);空间复杂度为O(n);稳定。
总结七大排序的时间复杂度,空间复杂度,稳定性
在这里插入图片描述
在这里插入图片描述

8.代码排序部分的测试

在这里插入图片描述

public static void main(String[] args) {int []arr1={5,6,4,2,7,9,1,2};paixu1(arr1);System.out.println("插叙1排序"+Arrays.toString(arr1));int []arr2={64,45,15,51,1,5,31};paixu2(arr2);System.out.println("插叙2排序"+Arrays.toString(arr2));int []arr3={64,112,56,46,95};haset(arr3);System.out.println("希尔排序"+Arrays.toString(arr3));int []arr4={64,45,15,51,1,5,31,88,46,95};xtion1(arr4);System.out.println("选择排序1"+Arrays.toString(arr4));int []arr5={10,6,4,2,7,9,1,2};xtion2(arr5);System.out.println("选择排序2"+Arrays.toString(arr5));int []arr6={8,6,91,3,56,1,656,2};duipa(arr6);System.out.println("堆排序"+Arrays.toString(arr6));int []arr7={2,1,3,7,5};mppx(arr7);System.out.println("冒泡排序"+Arrays.toString(arr7));int []arr8={8,6,4,2,7,9,1,2};quikpai(arr8);System.out.println("Hoare快速排序"+Arrays.toString(arr8));int []arr9={4,5,8,1,2,9,11,15,88};wquikpai(arr9);System.out.println("挖坑法快速排序"+Arrays.toString(arr9));int []arr10={4,5,8,1,2,9,11,88,18};shuang(arr10);System.out.println("前后指针法快排"+Arrays.toString(arr10));int []arr11={4,5,8,1,2,9,11,88,18};quikpai1(arr11);System.out.println("非递归快排"+Arrays.toString(arr11));int []arr12={45,65,45,89,97,111,12,1,2,5,6};merg(arr12);System.out.println("递归法归并排序"+Arrays.toString(arr12));int []arr13={45,65,45,89,97,111,12,1,2,5,6};merg1(arr13);System.out.println("非递归归并排序"+Arrays.toString(arr13));}

9.代码加效果大致测试时间(仅供参考)

数据随机时:
在这里插入图片描述
数据逆序时:
在这里插入图片描述

import java.util.Arrays;
import java.util.Random;public class time {public static void fuztarr(int []arr){for(int i=0;i<arr.length;i++){//数据逆序arr[i]=arr.length-i;}}public static void wfuzarr(int []arr){Random random=new Random(10000);//数据随机for (int i=0;i<arr.length;i++){arr[i]=random.nextInt();}}public static void chaxu1(int[]arr){arr= Arrays.copyOf(arr,arr.length);long start1=System.currentTimeMillis();test.paixu1(arr);long end1=System.currentTimeMillis();System.out.println("插叙1排序的时间:"+(end1-start1));}public static void chaxu(int[]arr){arr= Arrays.copyOf(arr,arr.length);long start1=System.currentTimeMillis();test.paixu2(arr);long end1=System.currentTimeMillis();System.out.println("插叙排序的时间:"+(end1-start1));}public static void xtion(int[]arr){arr= Arrays.copyOf(arr,arr.length);long start1=System.currentTimeMillis();test.xtion1(arr);long end1=System.currentTimeMillis();System.out.println("选择排序的时间:"+(end1-start1));}public static void qike(int[]arr){arr= Arrays.copyOf(arr,arr.length);long start1=System.currentTimeMillis();test.quikpai(arr);long end1=System.currentTimeMillis();System.out.println("Hoare快速排序的时间:"+(end1-start1));}public static void wqike(int[]arr){arr= Arrays.copyOf(arr,arr.length);long start1=System.currentTimeMillis();test.wquikpai(arr);long end1=System.currentTimeMillis();System.out.println("挖坑法快速排序的时间:"+(end1-start1));}public static void shenqike(int[]arr){arr= Arrays.copyOf(arr,arr.length);long start1=System.currentTimeMillis();test.shuang(arr);long end1=System.currentTimeMillis();System.out.println("前后指针快速排序的时间:"+(end1-start1));}public static void haxu(int []arr){arr= Arrays.copyOf(arr,arr.length);long start2=System.currentTimeMillis();test.haset(arr);long end2=System.currentTimeMillis();System.out.println("希尔排序的时间:"+(end2-start2));}public static void mp(int []arr){arr= Arrays.copyOf(arr,arr.length);long start2=System.currentTimeMillis();test.mppx(arr);long end2=System.currentTimeMillis();System.out.println("冒泡排序的时间:"+(end2-start2));}public static void main(String[] args) {//测试数据要稍微大,不然都是0.多少毫秒都是显示0不能直观的表示int []arr=new int [15000];//fuztarr(arr);wfuzarr(arr);chaxu1(arr);chaxu(arr);haxu(arr);mp(arr);xtion(arr);qike(arr);}
}

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

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

相关文章

前端常见标签

1. <!-- ! 快速生成标签 --> &#xff01;回车会立刻生成模板 2. <!-- CTRL / 生成注释--> 3. 文本标签 <!-- span 文本标签 --> 生成如下&#xff1a; 4. <!-- h1-h6标题标签 --> 大小依次递减 生成&…

PHP教育系统小程序

&#x1f310; 教育系统&#xff1a;全方位学习新体验&#xff0c;引领未来教育风尚 &#x1f680; 教育系统&#xff1a;创新平台&#xff0c;智慧启航 &#x1f4f1; 教育系统&#xff0c;一款深度融合科技与教育的创新平台&#xff0c;匠心独运地采用先进的ThinkPHP框架与U…

MySQL配置my.ini文件

my.ini文件中存储了数据库的文件地址&#xff0c;数据库数据存储地址以及登录密码等基础信息。在遇到忘记密码或者其他基础问题时&#xff0c;修改my.ini文件很方便。但是部分数据库版本默认不生成my.ini文件&#xff0c;需要自己进行配置。 1.停止数据库服务。在搜索框中输入…

【电视盒子】HI3798MV300刷机教程笔记/备份遥控码修复遥控器/ADB/线刷卡刷/电视盒子安装第三方应用软件

心血来潮&#xff0c;看到电视机顶盒满天飞的广告&#xff0c;想改造一下家里的电视盒子&#xff0c;学一下网上的人刷机&#xff0c;但是一切都不知道怎么开始&#xff0c;虽然折腾了一天&#xff0c;以失败告终&#xff0c;还是做点刷机笔记。 0.我的机器 年少不会甄别&…

Java中的构造器

Java中的构造器详解 1. 什么是构造器 构造器&#xff08;Constructor&#xff09; 是一种特殊的方法&#xff0c;用于在创建对象时初始化对象的状态。构造器的名字必须与类名相同&#xff0c;且没有返回类型&#xff0c;连 void 也不能使用。 2. 构造器的特点 名称与类名相同…

Zabbix监控山特UPS电源:实现高效监控与告警

背景 近期&#xff0c;随着机房迁移的进行&#xff0c;为了提升电力保障并确保设备的持续运行&#xff0c;我们在原有基础上新增了多台山特UPS电源作为备用电源。这些UPS电源的主要作用是在电力中断时为机房设备提供足够的电力支持&#xff0c;确保设备有充足的时间进行正常关…

计算机系统原理:一些断言

0 虚拟机和解释器 在Java中&#xff0c;JVM既充当了一个虚拟机的角色&#xff0c;也包含了用于执行字节码的解释器。同样地&#xff0c;Python的CPython实现也是先将源代码编译成字节码&#xff0c;然后由Python虚拟机执行。 1 从源代码中提取token的过程就是词法分析 词法分…

【正则表达式】从0开始学习正则表达式

正则表达式&#xff08;英语&#xff1a;Regular Expression&#xff0c;在代码中常简写为regex、regexp或RE&#xff09; 一、推荐学习网站 正则表达式 – 语法 | 菜鸟教程 正则表达式30分钟入门教程 | 菜鸟教程 编程胶囊-打造学习编程的最好系统 二、必知必记 2.1 元字符…

mysql之基本常用的语法

mysql之基本常用的语法 1.增加数据2.删除数据3.更新/修改数据4.查询数据 4.1.where子句4.2.order by4.3.limit与offset4.4.分组与having4.5.连接 5.创建表 1.增加数据 insert into 1.指定列插入 语法&#xff1a;insert into table_name(列名1,列名2,....,列名n) values (值…

Jenkins 启动

废话 这一阵子感觉空虚&#xff0c;心里空捞捞的&#xff0c;总想找点事情做&#xff0c;即使这是一件微小的事情&#xff0c;空余时间除了骑车、打球&#xff0c;偶尔朋友聚会 … 还能干什么呢&#xff1f; 当独自一人时&#xff0c;究竟可以做点什么&#xff0c;填补这空虚…

阳振坤:AI 大模型的基础是数据,AI越发达,数据库价值越大

2024年1月12日&#xff0c;第四届OceanBase数据库大赛决赛在北京圆满落幕。在大赛的颁奖典礼上&#xff0c;OceanBase 首席科学家阳振坤老师为同学们献上了一场主题为“爱上数据库”的公开课&#xff0c;他不仅分享了个人的成长历程&#xff0c;还阐述了对数据库行业现状与未来…

麦田物语学习笔记:场景切换淡入淡出和动态UI显示

基本流程 人物在切换场景有些僵硬,所以增加淡入淡出效果 1.代码思路 (1)核心原理是控制Fade Panel中的CanvasGroup中的Alpha值的大小来实现淡入淡出的效果 (2)用协程去表示变黑或变透明 (3)人物输入被阻拦的情况下,人物却还在移动,这个问题需要解决 2.代码实现 在TransitionM…

一次理清楚Java中的日期和时间

Java中的日期和时间 概述 学习最大的问题困难在于沉下心&#xff0c;现实社会纷乱复杂&#xff0c;充满诱惑&#xff0c;同时随着成家立业年岁增长更无当年之志&#xff0c;顿感无力。回想公瑾当年之言&#xff1a;“日抚谣琴听音&#xff0c;夜有娇妻伴读&#xff0c;此生足矣…

Linux探秘坊-------3.开发工具详解(2)

1.动静态库和动静态链接&#xff08;操作&#xff09; 静态库是指编译链接时,把库⽂件的代码全部加⼊到可执⾏⽂件中,因此⽣成的⽂件 ⽐较⼤,但在运⾏时也就不再需要库⽂件了。其后缀名⼀般为“.a” 动态库与之相反,在编译链接时并 没有把库⽂件的代码加⼊到可执⾏⽂件中 ,⽽…

亲测有效!如何快速实现 PostgreSQL 数据迁移到 时序数据库TDengine

小T导读&#xff1a;本篇文章是“2024&#xff0c;我想和 TDengine 谈谈”征文活动的优秀投稿之一&#xff0c;作者从数据库运维的角度出发&#xff0c;分享了利用 TDengine Cloud 提供的迁移工具&#xff0c;从 PostgreSQL 数据库到 TDengine 进行数据迁移的完整实践过程。文章…

C语言:位段

位段的内存分配: 1. 位段的成员可以是 int unsigned int signed int 或者是char &#xff08;属于整形家族&#xff09;类型 2. 位段的空间上是按照需要以4个字节&#xff08; 类型 int &#xff09;或者1个字节&#xff08; char &#xff09;的方式来开辟的。 3. 位段涉及…

多级缓存 JVM进程缓存

目录 多级缓存 1.什么是多级缓存 2.JVM进程缓存 2.1 导入案例 2.2 初识Caffeine 2.3 实现JVM进程缓存 2.3.1 需求 2.3.2 实现 3.Lua语法入门 3.1 初识Lua 3.1 HelloWorld 3.2.变量和循环 3.2.1 Lua的数据类型 3.2.3 循环 3.3 条件控制、函数 3.3.1 函数 3.3.2 条件控制 3.3.3 案…

记录一下OpenCV Contrib 编译踩的坑

最近有需要采用OpenCV Contrib 里面的函数做一下处理&#xff0c;要重新编译&#xff0c;一路编译两三个小时了&#xff0c;记录一下备忘吧。 1、编译前先准备好如下环境 ①visual studio已安装&#xff0c;具体版本和型号根据需求经验来&#xff0c;我看常用的是VS2015、VS201…

每日一刷——1.20——准备蓝桥杯

链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网 来源&#xff1a;牛客网 题目一 请统计某个给定范围[L, R]的所有整数中&#xff0c;数字2出现的次数。 比如给定范围[2, 22]&#xff0c;数字2在数2中出现了1次&#xff0c;在数12中出现1次&#xff0c;在数20中出现1次&a…

整数的分离与合成

整数的分离与合成 一、整数的分离1.1 整数拆成数字的方法1.1.1 取尾法1.1.2 取头法 1.2 任意整数的分离 二、整数的合成 整数是由数字和数位组成的&#xff0c;比如327是一个三位数&#xff0c;它的数字是3、2、7,数位是个数、十位、百位。 经常有些题目考查将一个整数拆分成各…