鱼C论坛

 找回密码
 立即注册
查看: 3231|回复: 0

[技术交流] 斐波那契查找

[复制链接]
发表于 2014-1-13 21:42:17 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
为小甲鱼的 斐波那契查找 进行补充,
#include <stdio.h>

#define MAXSIZE 20

//a是测试数组,n是数组个数,key是搜索的值
int fi(int *a,int n,int key){
    register int k,idx,offs;
    static int prevn = -1,prevk = -1;

    const static int Fib[16] = {0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610};//可以自己重写,这里只是测试用
    if(n != prevn){
        int f0,f1,t;
        for(f0=0,f1=1,k=1;f1<n;++k){//得出测试数组在FIB中的位置
            t=f1;
            f1+=f0;
            f0=t;
        }
        prevk = k;
        prevn = n;

    }else{
        k = prevk;
    }

    for(offs=0;k>0;){
        idx = offs+Fib[--k];
        if(idx>=n || key<a[idx]){
            continue;
        }else if(key >a[idx]){
            offs = idx;
            //--k;//这里可以优化算法一倍,不过加了会看不懂,就注释了
        }else
            return idx;
    }
    return -1;
}

int main(void)
{
    int a[MAXSIZE] = {1,5,15,22,25,31,39,42,47,49,59,68,88,99,100,110,120,130,140};//这个是测试数组
    int pos;

    pos = fi(a,20,140);
    if(pos != -1){
        printf("%d\n",pos);
    }else{
        printf("-1");
    }
    return 0;
}

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-22 03:21

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表