代码:
package com.wangyq.datastructrue.search;
import java.util.Arrays;
public class FibonacciSearch {
public static void main(String[] args) {
int[] ints = {1, 6, 18, 19, 37, 50, 61, 69, 76, 81, 83, 99, 108, 113, 114, 121, 124, 156, 180, 197};
System.out.println(Arrays.toString(ints));
int index = fibonacciSearch(ints, 0, ints.length - 1, 19);
System.out.println("第" + (index + 1) + "个");
}
private static int fibonacciSearch(int[] ints, int l, int r, int serchInt) {
if (l > r || serchInt < ints[l] || serchInt > ints[r]) {
return -1;
}
//获取斐波那契数列
int[] fibonacci = getFibonacci(20);
//记录斐波那契中的角标
int k = 1;
//获取斐波那契额中长度足够的角标
while (ints.length > fibonacci[k] - 1) {
k++;
}
//记录原始数组长度
int length = ints.length;
//扩充数组长度到斐波那契额中值的大小,并填充
if (fibonacci[k] > ints.length) {
ints = Arrays.copyOf(ints, fibonacci[k]);
int temp = ints[r];
for (int i = r; i < ints.length; i++) {
ints[i] = temp;
}
}
//允许等于
while (l <= r) {
//按值得比例计算大体位置
int midIndex = l + fibonacci[k - 1] - 1;
//取中间值
int mid = ints[midIndex];
//进行比较
if (serchInt > mid) {
l = midIndex + 1;
k -= 2;
} else if (serchInt < mid) {
r = midIndex - 1;
k--;
} else {
//如果值大于原始长度则确定的位置为扩充的部分数组
if (midIndex > length) {
return length - 1;
} else {
return midIndex;
}
}
}
return -1;
}
public static int[] getFibonacci(int i) {
int[] fibonacci = new int[i];
if (i > 0) {
fibonacci[0] = 1;
} else if (i > 1) {
fibonacci[1] = 2;
}
for (int j = 2; j < i; j++) {
fibonacci[j] = fibonacci[j - 1] + fibonacci[j - 2];
}
return fibonacci;
}
}
运行结果:
[1, 6, 18, 19, 37, 50, 61, 69, 76, 81, 83, 99, 108, 113, 114, 121, 124, 156, 180, 197]
第4个