斐波那契查找算法

对于斐波那契查找算法的学习,建议根据程序代码,找一组数据一步步测试一下,会比较容易加深理解。
斐波那契查找算法类似于折半查找算法(二分查找算法)
对于折半查找:其 mid 处于 low 和 high 的中间。
而斐波那契查找算法,其 mid 处于 low 和 high 的黄金分割点处。
/斐波那契数列,越往后其前一数值与后一数值的比值会越来越接近于0.618/

#include <iostream>

using namespace std;

const int MAXSIZE = 20;

/*此函数定义了一个斐波那契数列*/
int Fbi(int i)
{
    if(i < 2)
        return (i = 0) ? 0 : 1;
    return Fbi(i-1) + Fbi(i-2);
}

/*斐波那契查找算法,三个参数:所要查找的数列a[],所要查找的数据key,该数列数据元素的个数n*/
int Fbi_search(int * a,int key,int n)
{
    int mid,low,high;  /*三个数据,代表下标,类似于折半查找思路*/
    int k,i;
    low = 0;           /*一开始,low放在最低位*/
    high = n;          /*high放在最高位*/
    k = 0;

    while(n > Fbi(k) - 1)  /*注意这里是用于判断数据元素个数值n在斐波那契数列数的位置*/
        k++;               /*此处找出的k的值,有助于找出初始mid应该在的位置*/
    for(i = n; i < Fbi(k) - 1; i++)  /*补全数组,防止所要查找的数据是最高位数据时,出现数组越界的情况*/
        a[i] = a[n];

    while (low <= high)    /*类似于折半查找*/
    {
        mid =  low + Fbi(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;
            else
                return n;
        }
    }
    return -1;

}
int main()
{
    int a[MAXSIZE] = {0,1,16,24,35,47,59,62,73,88,99};
    int n,key,index;
    /*int test;*/
    n = 10;
    /*
    test = sizeof(a)/sizeof(int) - 1,这里需要注意MAXSIZE,a的数据元素个数是20,所以不能这样用;
    cout << test << endl;
    */
    cout << "请输入所要查找的数: ";
    cin >> key;
    index  = Fbi_search(a,key,n);
    if(index != -1)
        cout << "你所要查找的数所在位置: " << index << endl;
    else
        cout << "未找到你所要查找的数" << endl;
    return 0;
}

/点滴积累,我的一小步 O(∩_∩)O~/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值