package sf1_4;
/**
* Created by LoveQuietly on 2016/9/7.
*/
public class FibBinarySearch {
public static void main(String[] args) {
int myarr[] = {1, 2, 3, 5, 7, 9, 10, 11, 13, 15, 17, 19, 21, 24, 25, 26, 29};
//int myarr[]={1,2,3};
FibBinarySearch fibBinarySearch = new FibBinarySearch();
fibBinarySearch.fib();
int n = fibBinarySearch.binarySearch(myarr, 30);
System.out.println(n);
}
//定义最大的斐波拉契数列
final int MAX = 100;
//用来存储斐波拉契数列
int[] a = new int[100];
//初始化斐波拉奇书数列
public void fib() {
a[0] = 1;
a[1] = 1;
for (int i = 2; i < MAX; i++) {
a[i] = a[i - 1] + a[i - 2];
}
}
//查找数据
int binarySearch(int[] arr, int key) {
int pos = 0;
//在数列中查找最接近的大小
for (int i = 0; i < MAX; i++) {
if (a[i] >= arr.length) {
pos = i;
break;
}
}
// System.out.println(a[7]+" "+pos);
//使用临时数组大小跟斐波拉奇数列的那个数字相同
int[] temp = new int[a[pos]];
//初始化temp数组使得前面数据相同
for (int i = 0; i < arr.length; i++) {
temp[i] = arr[i];
}
//超过数组长度使用最后的数字填充
for (int i = arr.length; i < a[pos]; i++) {
temp[i] = arr[arr.length - 1];
}
int lo = 0;
int high = temp.length - 1;
int mid = 0;
//pos需要大于0保证数据不会溢出
while (lo <= high && pos >= 2) {
//我是已斐波拉契数列的前面一个为mid
mid = a[pos - 2] + lo - 1;
//大于往右走
if (temp[mid] > key) {
high = mid - 1;
//这里要-2才行
pos = pos - 2;
} else if (temp[mid] < key) {
lo = mid + 1;
//这里减1
pos--;
} else if (temp[mid] == key)
//找到分两种情况,一种是跟最后的数据相同返回最后的数据位置即可,一种是返回找到的位置
if (mid < arr.length - 1)
return mid;
else
return arr.length - 1;
}
return -1;
}
}