news 2026/4/3 2:48:41

面试手撕排序

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
面试手撕排序

手撕排序

(写的时候别忘了关提示,很多时候负面,给我错的代码还分心自己)

(小心别敲错一些变量,算法对了但是结果有问题,顺着逻辑梳理,看变量敲没敲错)

冒泡排序

原理:

扫描比较相邻不按顺序就交换(也可以理解为把第几大的依次放到后面)

packagesort;importjava.util.Scanner;publicclassmaopao{publicstaticvoidmain(String[]args){Scannersc=newScanner(System.in);intn=sc.nextInt(),a[]=newint[n];for(inti=0;i<n;i++){a[i]=sc.nextInt();}for(inti=0;i<n;i++){for(intj=0;j<n-i;j++){if(j!=n-i-1&&a[j]>a[j+1]){inttemp=a[j];a[j]=a[j+1];a[j+1]=temp;}}}for(inti=0;i<n;i++){System.out.print(a[i]+" ");}}}

选择排序

原理:

依次选最几小/大放到前面

packagesort;importjava.util.Scanner;publicclassxuanze{publicstaticvoidmain(String[]args){Scannersc=newScanner(System.in);intn=sc.nextInt(),a[]=newint[n];for(inti=0;i<n;i++){a[i]=sc.nextInt();}for(inti=0;i<n;i++){intmin=Integer.MAX_VALUE,wz=-1;for(intj=i;j<=n-1;j++){if(a[j]<min){min=a[j];wz=j;}}intsum=a[i];a[i]=min;a[wz]=sum;}for(inti=0;i<n;i++){System.out.print(a[i]+" ");}}}

快速排序

原理:

分治+分区,核心是分区,每次选基准值,要保证基准最左边的都比他小,右边的都比他大,可以理解为每次排好基准值对应的那个元素,分治就全排完。

packagesort;importjava.util.Scanner;publicclassquick{staticintn,a[]=newint[100005];publicstaticvoidmain(String[]args){Scannersc=newScanner(System.in);n=sc.nextInt();for(inti=0;i<n;i++){a[i]=sc.nextInt();}sort(0,n-1);for(inti=0;i<n;i++){System.out.print(a[i]+" ");}}staticvoidsort(intl,intr){if(l>=r)return;intzj=kp(l,r);sort(l,zj-1);sort(zj+1,r);}staticintkp(intl,intr){intsum=a[l];while(l<r){while(l<r&&a[r]>sum){r--;}if(l<r){a[l]=a[r];l++;}while(l<r&&a[l]<sum){l++;}if(l<r){a[r]=a[l];r--;}}a[l]=sum;returnl;}}

归并排序

原理:

分治+合并两个有序数组,合并细节可能有点麻烦,hot100应该都做过来链表版本的合并吧,这里就是换成了数组,主要也是注意一些边界细节啥的

packageguibing;importjava.util.Scanner;publicclassguibing{staticintn,a[]=newint[100005];publicstaticvoidmain(String[]args){Scannersc=newScanner(System.in);n=sc.nextInt();for(inti=0;i<n;i++){a[i]=sc.nextInt();}guib(0,n-1);for(inti=0;i<n;i++){System.out.print(a[i]+" ");}}staticvoidguib(intl,intr){if(l>=r)return;intmid=l+(r-l)/2;guib(l,mid);guib(mid+1,r);intcd1=mid-l+1,cd2=r-mid,az[]=newint[cd1],ar[]=newint[cd2],f1=0,f2=0,qd=l,f3=0,f4=0;for(inti=l;i<=mid;i++){az[f1++]=a[i];}for(inti=mid+1;i<=r;i++){ar[f2++]=a[i];}while(f3<cd1&&f4<cd2){if(az[f3]<=ar[f4]){a[qd++]=az[f3++];}else{a[qd++]=ar[f4++];}}while(f3<cd1){a[qd++]=az[f3++];}while(f4<cd2){a[qd++]=ar[f4++];}}}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/24 8:12:39

告警原理和处理流程深度剖析

莺的告警逻辑整体是追随 Prometheus 的逻辑&#xff0c;本文默认你已经对 Prometheus 的告警逻辑比较清楚。前置知识夜莺有两个进程&#xff1a;n9e 部署在中心&#xff0c;既是告警引擎&#xff0c;又是 webapin9e-edge 部署在边缘机房&#xff0c;作为告警引擎夜莺作为告警引…

作者头像 李华
网站建设 2026/3/28 23:32:55

给旧版 .NET 也开一扇“私有之门“ —— ILAccess.Fody 实现原理与设计

前言&#xff1a;从 UnsafeAccessor 说起在 .NET 8 中, 微软引入了一个让底层开发者非常心动的新特性 —— UnsafeAccessor它允许我们在不使用反射的情况下访问类的私有字段、方法或构造函数, 而且是强类型、零开销的.举个例子&#xff1a;class Dog{private string _name &qu…

作者头像 李华
网站建设 2026/4/1 16:14:41

java 设置日期返回格式的几种方式

在Java中设置Date字段的格式&#xff0c;通常有两种常见做法&#xff1a;1. 在实体类中使用注解格式化&#xff08;推荐&#xff09;import com.fasterxml.jackson.annotation.JsonFormat; import org.springframework.format.annotation.DateTimeFormat; import java.util.Dat…

作者头像 李华
网站建设 2026/4/1 9:44:25

自动售货机MCGS7.7和西门子S7-1200PLC联机程序博途V14,带注释和IO分配表

自动售货机MCGS7.7和西门子S7-1200PLC联机程序博途V14&#xff0c;带注释和IO分配表最近在折腾自动售货机的控制系统&#xff0c;用MCGS7.7触摸屏和西门子S7-1200PLC搭了个联机系统。这俩设备的通讯就跟谈恋爱似的&#xff0c;得互相听懂对方的语言才能干活。今天咱们就聊聊这个…

作者头像 李华