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