二分查找递归实现
public class Binarysearch {
public static int rank(int key,int[] a)
{
return rank(key,a,0,a.length-1);
}
public static int rank(int key,int[] a,int lo, int hi)
{
if(lo>hi)//左边界下标比有边界下标大,则不符合条件,
return -1;
int mid = lo+(hi-lo)/2;
if(key<a[mid])
rank( key,a,lo,mid-1);
else if(key>mid)
rank(key,a,mid+1,hi);
return mid;
}
}
题目:
使用1.1.6.4节中的rank() 递归方法重新实现BinarySearch 并跟踪该方法的调用。
* 每当该方法被调用时,打印出它的参数lo 和hi 并按照递归的深度缩进。
* 提示:为递归方法添加一个参数来保存递归的深度。
参考代码:
import edu.princeton.cs.algs4.StdIn;
import edu.princeton.cs.algs4.StdOut;
import edu.princeton.cs.algs4.StdRandom;
import java.util.Arrays;
/**
* 1.1.22
* 使用1.1.6.4节中的rank() 递归方法重新实现BinarySearch 并跟踪该方法的调用。
* 每当该方法被调用时,打印出它的参数lo 和hi 并按照递归的深度缩进。
* 提示:为递归方法添加一个参数来保存递归的深度。
*/
public class No_1_1_21 {
public static void main(String[] args)
{
StdOut.println("请输入初始数组的大小:");
int a = StdIn.readInt();
int [] array = iniarray(a);
StdOut.printf("初始数组为:%s%n", Arrays.toString(array));
StdOut.println("亲输入要查询的整数:");
int num = StdIn.readInt();
Rank(array,num);
}
public static int [] iniarray(int size)//注意此处返回一个数组的写法
{
int[] arr = new int[size];
arr[0] = StdRandom.uniform(10);//生成一个0-9的整数
for(int i=1;i<size;i++)
arr[i]=arr[i-1]+StdRandom.uniform(1,10);//产生一个0-9之间的整数
return arr;
}
public static int Rank(int[]arr,int key)
{
int lo=0,hi=arr.length-1;
int depth=0;
while(hi>=lo)//二分查找的条件:右边界不能比左边界小
{
StdOut.printf("当前深度:%3s, 下限位:%3s , 上限位:%3s%n",depth++,lo,hi);
int mid = lo+(hi-lo)/2;
if(key==arr[mid])
{
StdOut.printf("%s在数组中的位置是%s位", key,mid);
return mid;
}
else if(key > arr[mid])
{
lo = mid +1;
}
else
hi=mid-1;
}
StdOut.printf("数组中不存在此值%s%n",key);
return -1;
}
}
注意此处没有使用递归,但是用了while循环来实现二分查找;


浙公网安备 33010602011771号