一、基本思想
类似于二分查找,但是在找中间值时,不同,插值查找是自适应的mid,也就是mid=左+(右-左)*(找的数-arr[左])/(arr[右]-arr[左])
1)对于数据量较大,关键字分布比较均匀的查找表来说,采用插值查找, 速度较快.
2)关键字分布不均匀的情况下,该方法不一定比折半查找要好
二、代码
package com.ws.查找.二分查找;
//二分查找前提是数组是有序的
public class BinarySearch {
public static int a=0;
public static void main(String[] args) {
int arr[]={1,8,10,54,24,1777,8999,9999};
int i=zhao(arr,0,arr.length-1,1777);
System.out.println("找到的索引是="+i);
System.out.println("找到的值是="+arr[i]);
System.out.println("查找的次数是="+a);
}
/**
* 二分查找
* @param arr 数组
* @param zuo 左边索引
* @param you 右边索引
* @param value 要查找的值
* @return 返回找到的下标,没有找到就返回-1
*/
public static int zhao(int[] arr,int zuo,int you,int value){
a++;
//当zuo>you时,就没找到,结束递归
if (zuo>you){
return -1;
}
int mid=(zuo+you)/2;//中间
int midValue=arr[mid];//中间的值
if (value>midValue){//向右递归
return zhao(arr,mid+1,you,value);
}
else if (value<midValue){//向左递归
return zhao(arr,zuo,mid-1,value);
}else {
return mid;
}
}
}
找到的索引是=19
找到的值是=20
查找次数是=1