二分查找、快速排序、递归调用的分析

常见的基础算法,相信大家见过很多。接下来我来分析下二分查找、和快速排序算法。

二分查找:

前提是在已经排好序的数组中,通过查找的元素与中间元素索引值对应的元素进行比较,若大于中间索引值的元素,则向数组右半部分查找元素。依次类推,直到找到为止;找不到就返回一个负数;

二分查找的时间复杂度为O(log n)

下面是二分查找的代码:

/**
 * 二分查找法(折半查找):前提是在已经排好序的数组中,通过待查找的元素中与中间元素索引值对应的元素进行比较,若大于中间索引值对应的元素,去右半部分查找;
 * 否则去左半部分查找。一次类推,直到找到为止;找不到就返回一个负数;
 *
 *
 */
public class Erfenchazhao {
public static void main(String []args){
	int [] num = {10,20,40,80,100,150,200,280,420,500};//一个数组
	Erfenchazhao e = new Erfenchazhao();
	int index = e.binarysearch(num, 100);//将查找到的元素索引值赋值给index
	System.out.println(index);
}
public int binarysearch(int []num,int pointnumber){ //pointnumber表示要寻找的数字
	int start = 0;   //开始位置的下标
	int last= num.length-1;   //结束位置的下标
	while(start<=last){
		int middle = (start+last)/2; //中间索引值位置的下标
		if(num[middle]<pointnumber){ //若查找到的元素在右半部分
			start = middle+1;
		}
		else if(num[middle]>pointnumber){ //若查找到的元素在右半部分
			last=middle-1;
		}
		else{
			return middle; //找到了就返回元素的索引值
		}
	}
	return -1; 找不到就返回-1
}
}

 快速排序:

快速排序的时间复杂度为:n(logn),但是最糟糕的情况和冒泡选择一样时间复杂度为(n*n)

快速排序运用了分治法,先比较大小再分区:

1.先从数组中取出一个数作为基准数。

2.分区:将比这个数大的或等于的数放在它的右边,小于它的数全部放到它的左边。

3.在对左右取件重复第二步,直到各区间只有一个数;

实现思路:

挖坑填数:

1.把基准数挖出形成第一个坑

2.由后向前查找比它小的数,找到后挖出此数填到前一个坑中。

3.由前向后找比它大或等于的数,找到后也挖出此数填到前一个坑中。

4.重复执行第2步,第3步;

下面是代码:

public class Quickpaixu {
//以索引值进行分区
public void quicksort(int []num,int start,int last){
	if(start<last){
		int index=getindex(num,start,last);
		quicksort(num,start,index-1);
		quicksort(num,index+1,last);
	}
}
//获取基准数的索引值
public int getindex(int []num,int start,int last){
	int i=start;//第一个元素的下标
	int j=last;//最后一个元素的下标
	int temp=num[i];//第一个坑的数据
	while(i<j){
		//先从右往左对比,找到小于temp的数
		while(i<j&&num[j]>=temp){
			j--;
		}
		if(i<j){
			//把找到的元素放入对个坑位
			num[i]=num[j];
			i++;
		}
		//从左往右对比,找到大于等于temp的数
		while(i<j&&num[i]<temp){
			i++;
		}
		if(i<j){
			num[j]=num[i];
			j--;
		}
	}
	num[i]=temp;
	return i;
}
public static void main(String []args){
int [] num={12,1,9,15,60,7,99,7,44,60};
Quickpaixu q = new Quickpaixu();
q.quicksort(num, 0, num.length-1);
for(int i=0;i<num.length;i++){
	System.out.println(num[i]);
}
}
}

递归调用:

递归是指在函数的定义中使用函数自身的方法。

在编码递归函数的时候,必须告诉它何时停止递归。因此每个递归函数分为两部分:基线条件和递归条件;

基线条件指的是函数不在调用自己,从而避免无限循环下去。

递归条件指能够不停调用自己的方法。

下面是一个Fabonacci数列的问题例子,Fabonacci数列的描述是这样的,当n<=2时,f(1)=1,f(2)=1。  当n>=3时,f(n)=f(n-1)+f(n-2);

public class Digui {
public int f(int n){
	if(n==1||n==2){//当n等于1或者2时,跳出递归方法。
		return 1;
	}
	else{//当n大于2时不停调用递归方法,也就是己方法。
		return f(n-1)+f(n-2);
	}
	
}
public static void main(String []args){
	Digui d = new Digui();
	int x=d.f(40);//得到f方法得到f(40)的值。
	System.out.println(x);
}
}

上面是我的一些我对二分查找、快速排序、递归调用算法的简单的理解,错误之处,还请纠正。

猜你喜欢

转载自blog.csdn.net/coder150806/article/details/83038868
今日推荐