查找算法——斐波那契查找

一、C 程序实现、

/*******************************************************************************************
*Description 斐波那契查找算法
*Author liaoxiongxiong
*Version 1.0
*Time 2018-06-28
*******************************************************************************************/

#include <stdio.h>

const int max_size=20;//斐波那契数组的长度

//生成斐波那契数列
void Fibonacci(int *f)
{
    int i;
    f[0] = 0;
    f[1] = 1;
    for(int i=2; i<max_size; i++)
        f[i] = f[i-1] + f[i-2];
}


//斐波那契查找
int FibonacciSearch(int a[], int value, int n)
{
    int i;
    int low = 0;
    int high = n-1;
    int mid = 0;
    int k = 0;
    int F[max_size];
    Fibonacci(F);//构造一个斐波那契数组F

    while(n > F[k] - 1)
        k++;
    for(i=n; i<F[k]-1; i++)//把数组补全
        a[i] = a[high];
    while(low <= high)
    {
        mid = low + F[k-1] -1;//根据斐波那契数列进行黄金分割
        if(a[mid]>value)
        {
            high = mid-1;
            k = k-1;
        }
        else if(a[mid]<value)
        {
            low = mid+1;
            k = k-2;
        }
        else
        {
            if(mid <= high)//如果为真则找到相应的位置
                return mid;
            else
                return -1;
        }
    }
}

//测试用例
int main()
{
    int a[]={0,1,2,3,4,5,6,7,8,9};
    int len = sizeof(a)/sizeof(a[0]);

    int x = 2;   // 需要查找的元素

    int i = FibonacciSearch(a, x, len-1);
    if(i!=-1)
        printf("元素 %d 在第 %d 个位置\n",x,i+1);
    else
        printf("没有找到元素:%d\n",x);

    return 0;
}

运行结果:

猜你喜欢

转载自www.cnblogs.com/shujuxiong/p/9240493.html