/* 斐波那契查找的主要思想是: 利用斐波那契数列进行下表分割。 F(k)=F(k-1)+F(k-2) 那么: F(k)-1=F[k-1]-1+F[k-2] 也即有: F[k]-1=F[k-1]-1+1(mid,中间数)+F[k-2]-1; */ #include<cstdio> #define MAX 1000 int F[]={0,1,1,2,3,5,8,13,21,34};//全局数组 int Fibonacci_Search(int *a,int n,int key) { int low,mid,high,i,k; low=1; high=n; k=0; while(n>F[k])//计算n位于斐波那契数列的位置 k++; for(i=n;i<F[k]-1;i++)//将不满的数值补上 a[i]=a[n]; while(low<=high) { mid=low+F[k]-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;//mid即为找到的位置 else return n;//说明是补全的数值,返回n } } return 0; } int main(int argc,char *argv[]) { int Array[MAX]; int n,key; int i,index; scanf("%d",&n); for(i=1;i<=n;i++) scanf("%d",&Array[i]); scanf("%d",&key); index=Fibonacci_Search(Array,n,key); if(index==n||index==0) printf("Can not find!\n"); else printf("Find it,index is: %d\n",index); return 0; }
原文:http://blog.csdn.net/u012736084/article/details/18913405