斐波那契查找

斐波那契查找

/*
斐波那契查找的主要思想是:
利用斐波那契数列进行下表分割。
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;
}


斐波那契查找

上一篇:几个比较流行的IoC容器


下一篇:UVA 10881 - Piotr's Ants(思维题)