public class FibonacciSearch {
private static int maxSize = 20;
public static void main(String[] args) {
int[] arr = {1,92,37,16,28,12,7,6,4,6,6,5,-1,-18};
// for (int i = 0;i < 14;i++){
// arr[i] = i + 1;
// }
ShellSort.shellSort(arr);
System.out.println(Arrays.toString(arr));
System.out.println(fibonacciSearch(arr,16));
}
public static int[] fibonacciArray(int length){
if(length < 2){
throw new RuntimeException("fibonacci数列长度不能小于2,否则没意义");
}
int[] F = new int[length];
F[0] = 1;
F[1] = 1;
for (int i = 2; i < length ; i++) {
F[i] = F[i - 1] + F[i - 2];
}
return F;
}
public static int fibonacciSearch(int[] arr,int findValue){
/**
* 数组大概率不是fibonacci数,需要进行填充
*/
int length = arr.length;
int[] F = fibonacciArray(maxSize);
int k = 0;
/**
* 下面不用等于号,个人考虑是因为等于以后其实不用扩展数组。
* 还要加一个分支条件判断,索性就不加了
*/
while(length > F[k] - 1 ){
k++;
}
int[] extendArray = Arrays.copyOf(arr,F[k] - 1);
for (int i = length; i < F[k] - 1 ; i++) {
extendArray[i] = arr[length - 1];
}
/**
* 下面开始正式查找
*/
int low = 0;
int high = length - 1;
while(low <= high){
int mid = low + F[k - 1] - 1;
if( findValue < arr[mid]){
high = mid - 1;
k--;
} else if (findValue > arr[mid]) {
low = mid + 1;
k -= 2;
}else{
return mid < length ? mid : length - 1;
}
}
return -1;
}
}
java实现fibonacci search
最新推荐文章于 2024-05-31 10:46:10 发布