面试基础算法

面试常问的几种简单的算法和代码:单例模式、快排、二分查找

单例模式()

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值