• 二分查找递归实现


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

  • 相关阅读:
    C语言I博客作业07
    C语言I 博客作业03
    我的第一次作业
    C语言I博客作业05
    js闭包在你身边却不知
    浅谈SQL Transaction在请求中断后的行锁表锁
    事件订阅分发模型
    js 继承 对象方法与原型方法
    PHP学习笔记有关php中的变量
    PHP学习笔记不同编码占据不同的字节
  • 原文地址:https://www.cnblogs.com/qinmin/p/12270232.html
Copyright © 2020-2023  润新知