04斐波那契查找
基本思想:利用斐波那契数列去将原始数组分割比较,最后确定查找值key的位置。
讲解:
//创建一个名为Interpolation_search的方法,传入数组a及其大小以及查找值key
public static int Interpolation_search(int a[],int n,int key){
//定义斐波那契数列前两位数字:0、1
int f1 = 0,f2 = 1;
//定义第三位数字,斐波那契数列的规律是,当前位置数值由前两位之和
int f = f1 + f2;
//循环找出斐波那契数中第一个大于原数组a数组长度的数
while(f < n){
//f1和f2的值全部向后移位
f1 = f2;
f2 = f;
//让现在的f1和f2的和赋予f
f = f1 + f2;
}
//设置淘汰范围
int offset = -1;
//循环条件:斐波那契数始终大于1
while(f > 1){
//变量i保存offset + f1 和n - 1中的最小值
int i = Math.min(offset + f1,n - 1);
//判断当前下标i对应的值是否小于查找值key
if(a[i] < key){
//如果是则,f、f2整体向后移
f = f2;
f2 = f1;
//而f1的值变为f - f2
f1 = f - f2;
//让offset的值为此时的i
offset = i;
//若是大于
}else if(a[i] > key){
//f、f2的值整体向后移2位
f = f1;
f2 = f2 - f1;
//而f1的值变为f - f2
f1 = f - f2;
//若是等于
}else{
//直接返回此时的下标i
return i;
}
}
//若f2存在且最后的元素为key
if(f2 != 0 && a[offset + 1] == key){
//则直接返回offset + 1
return offset + 1;
}
//当所有任务等进行完毕仍未结束,直接返回-1,表示该数组中并无查找值
return -1;
}