斐波那契查找

思想

将一个排序数组利于斐波那契的方式分割,首先需要有一个斐波那契数组,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;
}

猜你喜欢

转载自blog.csdn.net/wzc2608/article/details/79899812