ja算法大全 ja数据结构和算法

又是新的一年。去年“金九银十”没赶上。问算法的时候,我一脸尴尬,犹豫不决。今年重新站起来,记住这些算法,手撕面试官!赶“金三银四”的第一班车!

java算法大全 java数据结构和算法

二分查找

也称为半搜索,它要求被搜索的序列是有序的。每次将中间位置的值与要搜索的关键字进行比较时,如果中间位置

如果的值大于要搜索的关键字,则在前半部分重复搜索过程。如果中间位置的值小于要搜索的关键字,

然后搜索的过程在后半部分循环。直到找到它,否则在序列中找不到关键字。

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集合和线程:

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。

发表回复

登录后才能评论