面试常用算法整理
知识点:基本算法 algorithms
1.线性查找
2.二分查找
描述:在数组中查找指定数值
首先要求该组元素必须是有序的,假设默认是从小到大排列,使用该组元素的中间元素与目标元素进行比较,如果相等则查找成功,如果中间元素比目标元素小,则去中间元素的右侧查找(递归),如果中间元素比目标元素大,则去中间元素的左侧查找(递归),直到找到目标元素 或者比较完毕,表示查找失败。
int a={3,6,7,9,16,28,32}
伪代码:
// 注意: 使用二分查找算法的前提是数组元素必须有序
public static void main(String[] args) {
int a={3,6,7,9,16,28,32}
int n=a.length;
SearchBinary(a,16,0,n);
}
public static int SearchBinary(int a[ ],int value,int left,int right){
if(left<=right){
int mid=(left+right)/2;
tempValue=a[mid];
// 和中间元素比较,如果相等,查找成功
if(tempValue==value){
return mid;
}
// 如果小于中间元素,去左边找
else if(tempValue>value){
return SearchBinary(a,value,left,mid-1);
}
// 如果大于中间元素,去右边找
else if(tempValue<value){
return SearchBinary(a,value,mid+1,right);
}
}
//比较完毕
return -1;
}
3.冒泡排序
int [] a = {10,4,7,3,9}; n=a.length;
<!--
数据举例demo
第一趟:: 4 7 3 9 10 交换 4次(5-1)
第二趟 :4 3 7 9 10 交换 3 次(5-2)
。。。
第i趟: 交换 n-i 次 (n-i)
-->
伪代码:
//n-1趟
for(int i=1;i<=n-1;i++){
//n-i次(i趟对应的次数)
for(int j=0;j<n-i;j++){
if(a[j]>a[j+1]){
//两瓶水交换,借助第三个瓶子为媒介
int tempcontainer=a[j];
a[j]=a[j+1];
a[j+1]=tempcontainer;
}
}
}
4.插入排序 (把n个待排序的元素看成一个有序表和一个无序表,开始时有序表中只有一个元素,无序表中有n-1个元素;排序过程即每次从无序表中取出第一个元素,将它插入到有序表中,使之成为新的有序表,重复n-1次完成整个排序过程。)
int [] a={3,1,5,23,2,4};n=a.length;
<!--
数据举例demo
第一趟: 1,3,5,23,2,4
第二趟: 1,3,5,23,2,4
。。。
第 i 趟 :
-->
伪代码:(详细思路代码,可参考https://www.cnblogs.com/snowcan/p/6244128.html)
//n-1趟循环
for (int i=1;i<n;i++){
//tempcontainer存放本轮插入有序列表中的数
int tempcontainer=a[i];
//判断tempcontainer要插入的位置
for(int j=i-1;j>=0&&a[j]>tempcontainer;j--){
//将第j上的元素,朝后移动
a[j+1]=a[j];
}
//将tempcontainer,插入到空出来的位置上
a[j+1]=tempcontainer; //到这里,之前for循环,j位置的元素已经移到j+1的位置上了,j--位置的元素如果不满足条件,跳出循环,此时要想在j的空位置上赋值,
//必须a[j+1],因为在跳出循环之前j--了
}
5.简单选择排序(基本思想:给定数组 int[] arr={里面n个数据};第1趟排序,在待排序数据arr[0]~arr[n-1]中选出最小的数据,将它与arrr[0]交换;第2趟,在待排序数据arr[1]~arr[n-1]中选出最小的数据,将它与r[1]交换;以此类推,第i趟在待排序数据arr[i-1]~arr[n-1中选出最小的数据,将它与r[i-1]交换,直到全部排序完成。)
int [] a={3,1,5,23,2,4};n=a.length;
<!--
数据举例demo
第一趟: 1,3,5,23,2,4
第二趟: 1,2,5,23,3,4
。。。
第 i 趟 :
-->
伪代码:(详细思路代码,可参考https://www.cnblogs.com/shen-hua/p/5424059.html)
//n-1趟循环
for(int i=0;i<n-1;i++){
int min=i; //第i趟最小值,下标用min来记录
for(int j=min+1;j<n;j++){ //选择最小记录
if(a[j]<a[min]){
min=j;//记下当前找到的最小值所在的位置
}
}
//内层循环结束后,已经找到了本轮循环的最小数,再进行交换
if(i !=min){//如果i下标的位置,不是最小值的话(min=i的情况),则交换a[i]和a[min]
int temp=a[i];
a[i]=a[min];
a[min]=temp;
}
}
6.n层汉诺塔问题
(知识点参考知乎:https://www.zhihu.com/question/24385418)
(伪代码参考https://www.cnblogs.com/gw811/archive/2012/10/10/2719181.html)
描述:
图片动画演示:
三维动画演示可查看:https://hightopo.com/demo/hanoi_20151106/index.html
伪代码:
public class Hanoi {
public static void move(int n,String from,String temp,String to){
if(n>0){
move(n-1,from,to,temp);
System.out.println("盘"+n+"由"+from+"移到"+to);
move(n-1,temp,from,to);
}
}
public static void main(String[] args) {
move(3,"A","B","C");
}
}
输出结果:
以上是伪代码,详细代码参考
博客:https://www.cnblogs.com/Ray1024/p/10337144.html
补充:关于其他经典排序算法(希尔排序、快速排序、归并排序、堆排序、基数排序等) 可以参考 https://www.cnblogs.com/fivestudy/p/10212306.html