查找-->二分查找和插值查找java实现

package com.cai.math;

/**
 *目标:实现二分查找 和 插值查找
 * 前提:两种查找都需要查找对象是一个有序的数组
 */
public class BinarySearch {
    public static void main(String[] args) {
        int[] arr = {1,2,3,4,5,6,7,8,9};

        System.out.println(search2(arr,0,8,5));
    }

    /**
     * 利用递归的方法来查到所需的值
     *  二分查找(分治算法)
     *  前提:是一个有序的数组
     *  思想:把数组对分成两个部分,锁定部分,直到找到具体的值
     * @param arr 所查找的数组
     * @param low 数组低角标
     * @param high 数组高角标
     * @param value 需要查找的值
     * @return 如果存在所找数值,返回对应得下角标值,否则返回-1
     */
    public static int search(int[] arr,int low,int high,int value){
        if(low>high){
            return -1;
        }
        int mid = (low+high)/2;
        if(value>arr[mid]){
            return search(arr,mid+1,high,value);
        }else if(value>arr[mid]){
            return search(arr,low,mid-1,value);
        }else{
            return mid;
        }
    }

    /**
     * 插值查找
     * 主要区别与二分查找的时 中间值的取值
     * (备注:value-->所需查找的值)
     * mid = low +(high - low)*(value-arr[low])/(arr[high]-arr[low])
     * @param arr
     * @param low
     * @param high
     * @param value
     * @return
     */
    public static int search2(int[] arr,int low,int high,int value){
        //注意:arr[low]>value || arr[high]<value  必须需要,否则我们得到的mid可能越界
        if(low>high || arr[low]>value || arr[high]<value){
            return -1;
        }
        int mid = low +(high - low)*(value-arr[low])/(arr[high]-arr[low]);
        if(value>arr[mid]){
            return search2(arr,mid+1,high,value);
        }else if(value>arr[mid]){
            return search2(arr,low,mid-1,value);
        }else{
            return mid;
        }
    }

}

 

posted @ 2020-09-27 11:15  就是你baby  阅读(151)  评论(0编辑  收藏  举报