思想
将一个排序数组利于斐波那契的方式分割,首先需要有一个斐波那契数组,0,1,1,2,3,5,8,13,21,34,55....
将数组按照斐波那契的方式分割后查找,比如一个长为25的数组,先将数组补为34,补充的值为数组的最大值,接着将数组分为俩部分1~21的21个数的左区域,22~34的13个数的右区域(计数从1开始),mid为a[21]:
1.如果要查找的值key比mid小,就查找左区域,同时将斐波那契数列前推一位变成13,下一步有21个数的左区域又会被分为有13个数的左区域与有8个数的右区域。
2.如果要查找的数比mid大,就查找右区域,同时将斐波那契数列前推俩位变成8,下一步有13个数的右区域又会被分为有8个数的左区域与有5个数的右区域。
最终如果查找到的索引小于25,就返回索引,大于25就返回25
斐波那契查找的平均性能比折半好,最差性能比折半差。
代码:
int Fibonacci(int* a, int key, int length)
{
int start, end, mid;
start = 1;
end = length;
k = 0;
while(n > F[k] - 1)//F[k]是存储斐波那契数列的数组
k++;
for(int i = length; i < F[k]; ++i)
a[i] = a[n];
while(start <= end)
{
mid = start + F[k] - 1;
if(key < a[mid])
{
end = mid - 1;
--k;
}
else if(key > a[mid])
{
start = mid + 1;
k -= 2;
}
else
{
if(mid <= n)
return mid;
else
return n;
}
}
return 0;
}