鱼C论坛

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

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

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

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

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

x
为小甲鱼的 斐波那契查找 进行补充,

  1. #include <stdio.h>

  2. #define MAXSIZE 20

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

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

  17.     }else{
  18.         k = prevk;
  19.     }

  20.     for(offs=0;k>0;){
  21.         idx = offs+Fib[--k];
  22.         if(idx>=n || key<a[idx]){
  23.             continue;
  24.         }else if(key >a[idx]){
  25.             offs = idx;
  26.             //--k;//这里可以优化算法一倍,不过加了会看不懂,就注释了
  27.         }else
  28.             return idx;
  29.     }
  30.     return -1;
  31. }

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

  36.     pos = fi(a,20,140);
  37.     if(pos != -1){
  38.         printf("%d\n",pos);
  39.     }else{
  40.         printf("-1");
  41.     }
  42.     return 0;
  43. }
复制代码


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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-26 11:28

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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