二分查找递归实现

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

 

posted @ 2020-02-06 20:32  清明道人  阅读(535)  评论(0编辑  收藏  举报