斐波那契序列 数据结构c语言,数据结构之---C语言实现斐波那契查找

斐波那契查找的核心思想是:

1)当key=a[mid]时,查找成功;

2)当key

3)当key>a[mid]时,新的查找范围是第mid+1个到第high个,此时范围个数为F[k-2] - 1个,即数组右边的长度,所以要在[F[k - 2] - 1]范围内查找。

斐波那契查找的前提是待查找的查找表必须顺序存储并且有序。

相对于折半查找,一般将待比较的key值与第mid=(low+high)/2位置的元素比较,

比较结果分三种情况

1)相等,mid位置的元素即为所求

2)>     ,low=mid+1;

3)  <     ,high=mid-1;

斐波那契查找与折半查找很相似,他是根据斐波那契序列的特点对有序表进行分割的。

他要求开始表中记录的个数为比某个斐波那契数小1的,及n = F[k]-1;

开始将k值与第F(k-1)位置的数据进行比较,(及mid=low+F(k-1)-1),

比较结果也分为三种

1)相等,mid位置的元素即为所求

2)>   ,low=mid+1,k-=2;

【注】:low=mid+1说明待查找的元素在[mid+1,hign]范围内,

k-=2 说明范围[mid+1,high]内的元素个数为 n-(F(k-1))   =  F[k] - 1 - F(k-1) = F[k] - F(k-1) - 1 =F(k-2)-1个,

所以可以递归的应用斐波那契查找

3) <    ,high=mid-1,k-=1;

【注】:low=mid+1说明待查找的元素在[low,mid-1]范围内,

k-=1 说明范围[low,mid-1]内的元素个数为F(k-1)-1

个,

所以可以递归 的应用斐波那契查找

代码:

//斐波那契查找

//杨鑫

#include

#include

#define MAXN 20

/*

*产生斐波那契数列

* */

void Fibonacci(int *f)

{

int i;

f[0] = 1;

f[1] = 1;

for(i = 2;i < MAXN; ++i)

f[i] = f[i - 2] + f[i - 1];

}

/*

* 查找

* */

int Fibonacci_Search(int *a, int key, int n)

{

int i, low = 0, high = n - 1;

int mid = 0;

int k = 0;

int F[MAXN];

Fibonacci(F);

while(n > F[k] - 1) //计算出n在斐波那契中的数列

++k;

for(i = n;i < F[k] - 1;++i) //把数组补全

a[i] = a[high];

while(low <= high)

{

mid = low + F[k-1] - 1; //根据斐波那契数列进行黄金分割

if(a[mid] > key)

{

high = mid - 1;

k = k - 1;

}

else if(a[mid] < key)

{

low = mid + 1;

k = k - 2;

}

else

{

if(mid <= high) //如果为真则找到相应的位置

return mid;

else

return -1;

}

}

return 0;

}

int main()

{

int a[MAXN] = {5,15,19,20,25,31,38,41,45,49,52,55,57};

int k, res = 0;

printf("请输入要查找的数字:\n");

scanf("%d", &k);

res = Fibonacci_Search(a,k,13);

if(res != -1)

printf("在数组的第%d个位置找到元素:%d\n", res + 1, k);

else

printf("未在数组中找到元素:%d\n",k);

return 0;

}

e8ba3c58a81d3a7dbf42cbc6459a17f6.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值