递归实现二分法数据的查询

1.掌握递归方法的使用

2.掌握二分法原理

本文章主要为记录以前的学习内容,通过二分法算法来回顾一下递归方法的使用。

首先来介绍一下二分法和递归的概念:

1)二分法:即一分为二的方法,在有序的区间列表中,通过区间中间数据与查询数据的对比,判断查询数据是在该区间数据中的上半部分还是下半部分,继而缩小对比范围依次类推,查询出查询数据的具体位置的算法。

2)递归:程序调用自身的编程技巧

言归正传,知道了概念之后,那么就直接上代码来看看二分法具体的实现:

/**
 *  二分法优缺点
 *  优点:比较次数少,查询速度快,平均性能好
 *  缺点:要求待查表示有序表,插入删除困难
 */
public class Dichotomy {

    public static void main(String[] args) {
        //有序数组
        int arr[] = {1,3,5,7,9,12,15,22,31,42,55};
        //待比较数字
        int number = 50;
        int result = dichotomy(number,arr,0,arr.length);

        if(result<=0){
            //小于等于0说明最小
            System.out.println("输入数据为最小数据,排在" + arr[0] + "之前!");
        } else if (result >= arr.length){
            //大于等于最大数组长度说明最大
            System.out.println("输入数据为最大数据,排在" + arr[arr.length-1] + "之后!");
        } else {
            //在区间内
            System.out.println("比较的数据在"+ arr[result-1] + "和" + arr[result] + "中间!");
        }
    }

    private static int dichotomy(int number, int[] arr ,int begin , int end) {
        //记录number在有序数组中的位置
        int count;
        int middle = (begin + end)/2;
        //输入数字大于等于最大的
        if(number>=arr[end-1]){
            count = end;
            return count;
        }
        //输入数字小于等于最小的
        if(number<=arr[begin]){
            count = begin-1;
            return count;
        }
        //当输入的开始+1等于结束时,说明数据在开始和结束之间
        if(end==(begin+1)){
            count = begin+1;
            return count;
        }
        //递归调用,二分法的精髓
        if(number>arr[middle]){
            return dichotomy(number,arr,middle,end);
        } else if(number<arr[middle]){
            return dichotomy(number,arr,begin,middle);
        } else {
            count = middle+1;
            return count;
        }
    }

}

代码出来了,结果是怎样的呢,这里咱们来测试几个数据,为了方便测试呢,这里咱们吧输入的数据做换成从数组中获取,如下:

int number[] = {0,1,9,13,55,56};
for(int i=0;i<number.length;i++){
    int result = dichotomy(number[i],arr,0,arr.length);
    if(result<=0){
         //小于等于0说明最小
         System.out.println("输入数据:"+ number[i] +"为最小数据,排在" + arr[0] + "之前!");
    } else if (result >= arr.length){
         //大于等于最大数组长度说明最大
         System.out.println("输入数据:"+ number[i] +"为最大数据,排在" + arr[arr.length-1] + "之后!");
    } else {
         //在区间内
         System.out.println("比较的数据:"+ number[i] +"在"+ arr[result-1] + "和" + arr[result] + "中间!");
    }
}

这个时候就可以直接运行看结果了,效果如下:

猜你喜欢

转载自blog.csdn.net/u013364067/article/details/84069770