二分查找递归实现
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循环来实现二分查找;