斐波那契查找算法的的核心在于:
1)当key = a[mid]时,查找成功;
2)当key < a[mid]时,新范围是第low个到第mid-1个,此时范围个数为F[k-1]-1个;
3)当key > a[mid]时,新范围是第m+1个到第high个,此时范围个数为F[k-2]-1个。
时间复杂度是O(logn),但就平均性能来说,斐波那契查找要优于折半查找。可惜如果是最坏情况,比如下例中key = 1,那么始终都处于左侧长半区在查找,则查找效率要低于折半查找。
代码如下:
#include <iostream>
using namespace std;
/************************************************************************/
/* 斐波那契查找 */
/************************************************************************/
int F[100]; /* 斐波那契数列 */
int Fibonacci_Search(int *a,int n,int key)
{
int low,high,mid,i,k=0;
low=1; /* 定义最低下标为记录首位 */
high=n; /* 定义最高下标为记录末位 */
while(n>F[k]-1)
k++;
for (i=n;i<F[k]-1;i++)
a[i]=a[n];
while(low<=high)
{
mid=low+F[k-1]-1;
if (key<a[mid])
{
high=mid-1;
k=k-1;
}
else if (key>a[mid])
{
low=mid+1;
k=k-2;
}
else
{
if (mid<=n)
return mid; /* 若相等则说明mid即为查找到的位置 */
else
return n;
}
}
return 0;
}
int main()
{
int a[20] = {0,1,16,24,35,47,59,62,73,88,99};
F[0]=0;
F[1]=1;
for(int i = 2;i < 100;i++)
{
F[i] = F[i-1] + F[i-2];
}
cout<<Fibonacci_Search(a,10,62)<<endl;//如果返回-1,则查找失败
getchar();
return 0;
}
结果: