斐波那契查找 package search; import java.util.Arrays; public class FibonacciSearch { public static int maxSize = 20; public static void main(String[] args) { int[] arr = {1,8,10,89,1000,1234,1234,1234,1234,1234,1234,1234,1234,1234}; System.out.println("index = "+fibSearch(arr,1234)); } //因为后面我们mid=1ow+F(k-1)-1,需要使用到斐波那契数列,因此我们需要先获取到一个斐波那契数列 public static int[] fib(){ int[] f = new int[maxSize]; f[0] = 1; f[1] = 1; for (int i= 2;i < maxSize;i++){ f[i] = f[i-1] + f[i-2]; } return f; } //编写斐波那契查找算法 /** * * @param a 数组 * @param key 查找的关键值 * @return */ public static int fibSearch(int[] a,int key){ int low = 0; int high = a.length-1; int k = 0; //表示斐波那契分割数值的下标 int mid =0;// int f[] = fib();//获取斐波那契数列 //获取斐波那契分割数值的下标 while(high > f[k] - 1){ k++; } //因为f[k] 值可能大于a的长度,因此我们需要使用Arrays类,构造一个新的数组,并指向a[] //不足的部分会使用0填充 int[] temp = Arrays.copyOf(a,f[k]); //实际上需求使用a数组最后的数填充temp for (int i = high + 1; i < temp.length;i++){ temp[i] = a[high]; } //找key while(low <= high){//条件满足就继续找 mid = low + f[k-1] - 1; if (key < temp[mid]){ high = mid - 1; k--; }else if (key > temp[mid]){ low = mid + 1; k -=2; }else { if (mid <= high){ return mid; }else{ return high; } } } return -1; } }