常见的基础算法,相信大家见过很多。接下来我来分析下二分查找、和快速排序算法。
前提是在已经排好序的数组中,通过查找的元素与中间元素索引值对应的元素进行比较,若大于中间索引值的元素,则向数组右半部分查找元素。依次类推,直到找到为止;找不到就返回一个负数;
二分查找的时间复杂度为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){ //若查找到的元素在右半部分
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=temp){
j--;
}
if(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);
}
}
上面是我的一些我对二分查找、快速排序、递归调用算法的简单的理解,错误之处,还请纠正。