又是新的一年。去年“金九银十”没赶上。问算法的时候,我一脸尴尬,犹豫不决。今年重新站起来,记住这些算法,手撕面试官!赶“金三银四”的第一班车!
二分查找
也称为半搜索,它要求被搜索的序列是有序的。每次将中间位置的值与要搜索的关键字进行比较时,如果中间位置
如果的值大于要搜索的关键字,则在前半部分重复搜索过程。如果中间位置的值小于要搜索的关键字,
然后搜索的过程在后半部分循环。直到找到它,否则在序列中找不到关键字。
public static int biSearch(int[]array,int a){
int lo = 0;
int hi = array . length-1;
int mid
while(lo & lt;=嗨){
mid =(lo+hi)/2;//中间位置
if(array[mid]==a){
返回mid+1;
} else if(array[mid]& lt;A){ //向右看
lo = mid+1;
}else{ //向左看
hi =中1;
}
}
return-1;
}
冒泡排序算法
(1)比较前后两个相邻的数据,如果前一个数据大于后一个数据,则交换这两个数据。
(2)这样遍历一次数组的第0个数据到第N-1个数据后,最大的数据会“下沉”到数组的第一个数据。
N-1个职位。
(3)N=N-1,如果N不为0,重复前面两步,否则排序完成。
public static void bubble sort 1(int[]a,int n){
int i,j;
for(I = 0;我& ltn;I++){//表示n个排序过程。
for(j = 1;j & ltn-I;j++){
if(a[j-1]& gt;A[j]){//如果前一个数大于后一个数,就交换。
//交换a[j-1]和a[j]
内部温度;
temp = a[j-1];
a[j-1]= a[j];
a[j]= temp;
}
}
} }
插入排序算法
通过构造一个有序序列,在有序序列中从后向前扫描无序数据,找到相应的位置并插入。
插入排序非常类似于整张扑克牌。当你开始摸牌时,你的左手是空,牌面朝下放在桌上。然后,有一次从
触摸桌子上的一张卡片,将其插入左手卡片的正确位置。为了找到这张卡的正确位置,有必要
它从右到左比较手中的牌。任何时候,左手的牌都是井井有条的。
如果输入数组已经按顺序排列,插入排序看起来是最好的情况,它的运行时间是输入比例的线性函数。
数数。如果输入数组以相反的顺序排列,将会出现最坏的情况。一般情况与最坏情况相同,其时间成本为(n2)。
公共void排序(int arr[])
{
for(int I = 1;我& lt数组长度;i++)
{
//插入次数
int insert val = arr[I];
//插入的位置(与前一个数字进行比较)
int index = I-1;
//如果插入的数字小于插入的数字
while(index & gt;= 0 & amp& ampinsertVal & ltarr[索引])
{
//将arr[index]向后移动。
arr[index+1]= arr[index];
//向前移动索引
索引-;
}
//将插入的数字放在适当的位置。
arr[index+1]= insert val;
}
}
快速排序算法
快速排序的原则:选择一个键值作为基准值。小于参考值的所有值都在左序列中(通常是无序的),
任何大于参考值的都在右边(一般是无序的)。通常选择序列的第一个元素。
一个循环:从后往前对比,对比参考值和上一个值,如果小于参考值,交换位置,如果不小于参考值。
继续比较下一个,直到发现第一个值小于基准值。找到这个值后,从头到尾比较。
比较,如果有大于参考值的,交换位置,如果没有,继续比较下一个,直到找到第一个大于参考值的。
价值是交换的。直到从前到后比较索引>:从前到后比较索引,结束第一个循环。此时,对于基准值,
一般来说,左右是有序的。
public void sort(int[] a,int low,int high){
int start =低电平;
int end =高;
int key = a[low];
while(end & gt;开始){
//从后向前比较
while(end & gt;开始& amp& ampa[end]& gt;=键)
//如果没有比键值小的,就比较下一个,直到有比键值小的交换位置,再从前到后比较。
end-;
if(a[end]& lt;=key){
int temp = a[end];
a[end]= a[start];
a[start]= temp;
}
//从前到后进行比较
while(end & gt;开始& amp& ampa[start]& lt;=键)
//如果没有大于键值的,就比较下一个,直到有大于键值的交换位置。
start++;
if(a[start]& gt;=key){
int temp = a[start];
a[开始]= a[结束];
a[end]= temp;
}
//此时第一次循环比较已经结束,键值的位置已经确定。左边的值都比键值小,右边的也比键值小。
值大于键值,但是两边的顺序可能不同。进行以下递归调用。
}
//递归
if(start & gt;low)排序(a,low,start-1);//左序列。键值索引-1的第一个索引位置
if(end & lt;高)排序(a,end+1,高);//序列在右边。从键值索引+1到最后一个
}
}
希尔排序算法
基本思路:首先把整个待排序的记录序列分成几个子序列进行直接插入排序,等待整个序列。
当中的记录“基本有序”时,直接插入所有记录并依次排序。
1.操作方法:
选择增量序列t1,t2,…,tk,其中ti >;tj,tk = 1;
2.根据增量序列的个数k,对序列进行k次排序;
3.每遍排序:根据对应的增量ti,将待排序的列分成若干个长度为m的子序列,每个子序列单独列出。
行被直接插入排序中。只有当增量因子为1时,才把整个序列当作一个表,表的长度就是整个序列的长度。
度。
私有void shellSort(int[] a) {
int dk = a.length/2;
while(dk & gt;= 1 ){
ShellInsertSort(a,dk);
dk = dk/2;
} }
private void shell insertsort(int[]a,int dk) {
//类似于插入排序,只不过插入排序的增量是1,这里的增量是dk,把1改成dk就行了。
for(int I = dk;我& lta .长度;i++){
if(a[I]& lt;a[i-dk]){
int j;
int x = a[I];//x是要插入的元素。
a[I]= a[I-dk];
for(j = I-dk;j & gt= 0 & amp& ampx & lta[j];j=j-dk){
//通过循环,一次后退一位,找到要插入的位置。
a[j+dk]= a[j];
}
a[j+dk]= x;//插入
} } }
总结
由于文章篇幅所限,还有几个算法就不一一写出来了。边肖专门整理了一个面试合集,里面包含了全面的算法分析和其他面试常问的知识点汇总。希望对2020年即将求职的打码朋友有所帮助。需要这本采访集的朋友可以关注添加私信回复边肖的《采访资料》,免费获取。
微服务:
Ja集合和线程:
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。