#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)。