面试常问的几种简单的算法和代码:单例模式、快排、二分查找
单例模式()
DCL,double check lock,属于懒汉模式
public class SingleModel{
//添加静态属性(保证在内存中唯一),volatile修饰(保证线程可见和禁止重排序)
private static volatile SingleModel instance;
//私有构造函数,禁止外部创建对象
private SingleModel(){}
//获取对象的唯一途径
public static SingleModel getInstance(){
//如果没有创建对象,才给创建
if(instance == null){
//防止多线程并发
synchronized(SingleModel.class){
//volatile不具有原子性,必须再次判断
if(instance == null){
instance = new SingleModel();
}
}
}
return instance;
}
}
快速排序
快速排序的最坏时间复杂度和冒泡一样O(n^2),平均复杂度为O(nlogn),分为递归实现和非递归实现。
//递归实现
public void quickSort(int[] a,int low, int high){
int i = low ,j = high;
//出递归的条件
if(i>j){
return;
}
//必须放在判断之后,否则溢出
int temp = a[low]
while(i<j){
while(temp <= a[j] && i<j){
j--;
}
while(temp >= a[i] && i<j){
i++;
}
if(i < j){
int m = a[i];
a[i] = a[j];
a[j] = m;
}
}
a[low] = a[i];
a[i] = temp;
quickSort(a,low,i-1);
quickSort(a,i+1,high);
}
二分查找
二分查找使用条件是,数组必须有序。时间复杂度为log2(n)
//数组不能有重复,否则报错
public int binSearch(int[] a,int value){
int low = 0;
int high = a.length -1;
while(low <= high){
//这样求中间值,是防止high+low超出int的范围溢出
int mid = low + (high-low)>>1;
if(a[mid] > value){
high = mid - 1;
}
if(a[mid] < value){
low = mid + 1;
}
if(a[mid] == value){
return mid;
}
}
return -1;
}