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;
}
}
}