#include<bits/stdc++.h>
using namespace std;
int Fibonacci(int n)
{
int f = 0, g = 1;
while (n--)
{
g += f;
f = g - f;
}
return f;
}
int FibonacciSearch(int* a, int n, int key)
{
int low = 1, high = n, mid, i, k = 0;
while (n > Fibonacci(k) - 1)k++;
for (i = n; i < Fibonacci(k) - 1; i++)a[i] = a[n];
while (low <= high)
{
mid = low + Fibonacci(k - 1) - 1;
if (key < a[mid])
{
high = mid - 1;
k -= 1;
}
else if (key > a[mid])
{
low = mid + 1;
k -= 2;
}
else
{
if (mid <= n)return mid;
else return n;
}
}
return -1;
}
int main(void)
{
int a[10] = { 2,3,7,8,9,12,14,16,17 }, key;
cin >> key;
int FibonacciResult = FibonacciSearch(a, sizeof(a)/sizeof(int), key);
cout << FibonacciResult << endl;
}
思路:
斐波那契查找与折半查找很相似,他是根据斐波那契序列的特点对有序表进行分割的。他要求开始表中记录的个数为某个斐波那契数小1,及n=F(k)-1;
开始将k值与第F(k-1)位置的记录进行比较(及mid=low+F(k-1)-1),比较结果也分为三种
1)相等,mid位置的元素即为所求
2)>,low=mid+1,k-=2;
说明:low=mid+1说明待查找的元素在[mid+1,high]范围内,k-=2 说明范围[mid+1,high]内的元素个数为n-(F(k-1))= Fk-1-F(k-1)=Fk-F(k-1)-1=F(k-2)-1个,所以可以递归的应用斐波那契查找。
3)<,high=mid-1,k-=1。
说明:low=mid+1说明待查找的元素在[low,mid-1]范围内,k-=1 说明范围[low,mid-1]内的元素个数为F(k-1)-1个,所以可以递归 的应用斐波那契查找。
时间复杂度O(logn)。