package search;
import java.util.Arrays;
public class FibSerch {
public static void main(String[] args) {
// 数组一定要有序
int[] array = {1,2,3,4,5,6,7,8,9};
System.out.println(fibSerch(array, 9));
}
// 获取斐波那契数列
public static int[] getFib(int size) {
int[] fib = new int[size];
fib[0] = 0;
fib[1] = 1;
for (int i = 2; i < size; i++) {
fib[i] = fib[i-1] + fib[i-2];
}
return fib;
}
// 肥波查找
public static int fibSerch(int[] a, int n) {
int l = 0; // 左指针
int r = a.length - 1; // 右指针
int mid;
// 创建斐波那契数列
int[] fib = getFib(20);
// 找到斐波那契数组中第一个大于或者等于原数组长度的数字的下标
int i = 0;
while (fib[i] < a.length) {
i++;
}
// 创建一个排序数组
int[] temp = Arrays.copyOf(a, fib[i]);
// 把排序数组比原数组多出来的元素全部赋值原数组的最后一个元素
for (int j = a.length; j < temp.length; j++) {
temp[j] = a[a.length-1];
}
while (l <= r) {
mid = l + fib[i-1] - 1;
if (temp[mid] == n) {
if (mid <= r) {
return mid;
}else {
return r;
}
}
if (temp[mid] < n) {
l = mid + 1;
i -= 2;
}
if (temp[mid] > n) {
r = mid - 1;
i -= 1;
}
}
return -1;
}
}
斐波那契查找(Java)
最新推荐文章于 2022-05-06 10:25:38 发布