代码
public class Main {
public static void main(String[] args) {
int arr2[] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18};
System.out.println(fibonacciSearch(arr2,6));
}
//得到斐波那契数列
public static int[] getFibonacci(int maxSize){
int[] fibonacci = new int[maxSize];
fibonacci[0] = 1;
fibonacci[1] = 1;
for (int j = 2;j < maxSize;j++){
fibonacci[j] = fibonacci[j - 1] + fibonacci[j - 2];
}
return fibonacci;
}
public static int fibonacciSearch(int[] arr,int findVal){
//首先得到斐波那契数列
int[] fibonacci = getFibonacci(40);
int arrExpansionSize = 0;
int high = arr.length - 1;
int low = 0;
int mid = 0;
int k = 0;//斐波那契数列的下标
//然后在斐波那契数列中找到第一个大于或等于数组长度的数
// while (fibonacci[k] < arr.length){
// if (k == fibonacci.length){
// break;
// }
// k++;
// }
for (int i = 0;i < fibonacci.length;i++){
if (fibonacci[i] >= arr.length){
arrExpansionSize = fibonacci[i];
k = i;
break;
}
}
//将原数组扩容
int[] arrExpansion = Arrays.copyOf(arr,arrExpansionSize);
//将扩容部分的值由0替换为最后一个值
for (int j = high + 1;j < arrExpansionSize;j++){
arrExpansion[j] = arrExpansion[high];
}
System.out.println("扩容后数组为"+Arrays.toString(arrExpansion));
//进行查找
while (true){
if (low > high){
break;
}
mid = low + fibonacci[k-1]-1;
if (arr[mid] > findVal){
//说明要查找的值在左边
high = mid - 1;
k--;
}else if (arr[mid] < findVal){
low = mid + 1;
k -=2;
}else {
if (mid < high){
return mid;
}else {
//说明是扩充元素
return high;
}
}
}
return -1;
}
}
结果
扩容后数组为[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 18, 18, 18]
5