文件名称:数据结构与算法(JAVA篇)之递归算法(二)
文件大小:4KB
文件格式:TXT
更新时间:2011-12-17 02:44:32
数据结构与算法(JAVA篇)之递归算法(二)
/**
*
* @author SunnyMoon
*/
/**
* 概念介绍:
*
* 递归的二分查找: 想用最少的比较次数在一个有序的数组中找到一个给定的数据项。
*
* 非递归的二分查找:二分查找也可以用非递归的算法,但是分治算法通常要回到递归。分治算
* 法常常是一个方法,在这个方法中含有两个对自身的递归的调用。
*
* 分治算法:递归的二分查找是分治算法的一种实现方法。把一个是问题分成两个更小的问题,
* 并且解决它们。这个过程一直持续下去直到易于求解的基值情况,就不需再分了。
* 分治算法常常是一上方法,在这个方法中含有两个对自身的递归调用,分别对应于
* 问题的两个部分。在二分查找中,就有两个这样的调用,但是只有一个真的执行了
* (调用哪一个取决于关键字的值)。
* 递归的效率:调用一个方法会有一定的代价和开销。首先,控制必须须从当前位置转移到调用
* 方法的开始处。其次,传给这个方法的参数以及这个方法返回地址都要初压到一
* 个栈里,为的是方法能够访问参数以及知道返回值在存储在哪里,这个过程也称
* "保存现场"。递归方法的使用的本质是从概念上简化了问题,而不是因为它更有
* 效率。当使用递归的效率很低的时候,就可以考虑如果把递归转化成非递归。
*/
class OrdArray {
private long[] a;
private int nElems;
public OrdArray(int max) {
a = new long[max];
nElems = 0;
}
public int size() {
return nElems;
}
public int find(long searchKey) {
return recFind(searchKey, 0, nElems - 1);//调用递归方法
//return recFind2(searchKey, 0, nElems - 1);//调用非递归方法
}
public int recFind(long searchKey, int lowerBound, int upperBound) {//递归方法定义
int curIn = (lowerBound + upperBound) / 2;
if (a[curIn] == searchKey) {
return curIn;
} else if (lowerBound > upperBound) {
return nElems;
} else {
if (a[curIn] < searchKey) {
return recFind(searchKey, curIn + 1, upperBound);
} else {
return recFind(searchKey, lowerBound, curIn - 1);
}
}
}
public int recFind2(long searchKey, int lowerBound, int upperBound){//非递归方法定义
int curIn=0;
while(true){
curIn=(lowerBound+upperBound)/2;
if(a[curIn]==searchKey)
return curIn;
else if(lowerBound>upperBound)
return nElems;
else{
if(a[curIn]