斐波那契查找法类似与二分查找法,但是不同的是,是以黄金分割点来进行查找的,而斐波那契数列的相邻两项之比正好与黄金分割相似,所以可以利用斐波那契数列的值来计算。
在这个算法中,必须使用顺序数组,而且在判断目标数在黄金分割点的左右两边的取值法都有所不同,这里可以通过图解来得出
import java.util.Arrays;
public class fibonacisearch {
public static int maxsize =20;
public static int[] fibonaci()
{
int[] f=new int[maxsize];
f[0]=1;
f[1]=1;
for(int i=2;i<maxsize;i++)
{
f[i]=f[i-1]+f[i-2];
}
return f;
}
/**
*
* @param array输入的数组
* @param target目标值
* @return返回的下标,没有找到则返回-1
*/
public static int search(int[] array,int target)
{
int low=0;
int high=array.length-1;
int k=0;//k为分割数值的点
int mid =0;
int[] arr=fibonaci();
while(high>arr[k]-1)
{
k++;
}
//当输入的数组长度小于这个要分割的这个k的长度,那么就要给他补齐长度
int[] temp=Arrays.copyOf(array, arr[k]);
for(int i=high+1;i<temp.length;i++)
{
temp[i]=arr[high];
}
while(low<=high)
{
mid=low+arr[k-1]-1;
if(target<temp[mid])
{
high=mid-1;
k--;//当改变了high之后数组的长度发生了改变,导致原来的k是会大于现在的长度,所以要k--;来缩小数组的长度
}
else if(target>temp[mid])
{
low=mid+1;
k-=2;//k--与k-2的原因由于一开始一整条分为了k-1与k-2,而前面为k-1所以要--;后面为k-2所以每次减2;
}
else
{
if(mid<=high)
{
return mid;
}
else
{
return high;
}
}
}
return -1;
}
public static void main(String[] args) {
int[] arr= {1,8,10,89,1000,1234};
System.out.print(search(arr,1000));
}
}