C实现 费氏查找算法
问题引入
费氏数列即斐波那契数列。
斐波那契数列,又称黄金分割数列,数列形式为:0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368……在数学上,斐波纳契数列根据以下递归方法定义:F(0)=0,F(1)=1,F(n)=F(n-1)+F(n-2)(n≥2,n∈N*)。数列的特点为:(1)从第3项开始,每一项都等于前两项之和。(2)第0项是0,第1项是第一个1。
费氏查找即利用费氏数列(斐波那契数列)作为间隔查找元素(确定下一元素的位置),通过划分区间加快区间收敛的速度,提高查找效率,时间复杂度为O(logn)。
代码实现
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define MAX 15
#define SWAP(x,y) {int t; t = x; x = y; y = t;} //元素交换 void createfib(void);
int findx(int, int);
int fibsearch(int[], int);
void quicksort(int[], int, int);
int Fib[MAX] = {-999};int main() {int number[MAX] = {0}; int i, find;srand(time(NULL));for(i = 1; i <= MAX; i++){ number[i] = rand() % 100;}quicksort(number, 1, MAX); printf("查找对象数列为:");for(i = 1; i <= MAX; i++) printf("%d ", number[i]);printf("\n\n输入寻找对象:"); scanf("%d", &find);if((i = fibsearch(number, find)) >= 0) printf("\n数字 %d 在第 %d 个位置。",find,i);else printf("\n找不到指定数");printf("\n");return 0;
}// 建立费氏数列
void createfib() { int i;Fib[0] = 0;Fib[1] = 1;for(i = 2; i < MAX; i++) Fib[i] = Fib[i-1] + Fib[i-2];
}//找x值
int findx(int n, int find){ int i = 0;while(Fib[i] <= n) i++;i--;return i;
}//查找
int fibsearch(int number[], int find){ int i, x, m;createfib();x = findx(MAX+1,find); m = MAX - Fib[x];x--;i = x;if(number[i] < find) i += m;while(Fib[x] > 0){ if(number[i] < find) i += Fib[--x];else if(number[i] > find) i -= Fib[--x];else return i;}return -1;
}void quicksort(int number[], int left, int right) { int i, j, k, s;if(left < right) {s = number[(left+right)/2]; i = left - 1;j = right + 1;while(1) {while(number[++i] < s) ; // 向右找while(number[--j] > s) ; // 向左找 if(i >= j) break;SWAP(number[i], number[j]);//交换元素 }quicksort(number, left, i-1); // 对左边进行递回quicksort(number, j+1, right); // 对右边进行递回}
}
运行结果
C实现 费氏查找算法相关推荐
- 算法--兔子生兔子的问题(费氏数列)
#include <stdio.h> int Fib( int n ) {// 说明// Fibonacci 为 1200 年代的欧洲数学家 , 在他的着作中曾经提到 : 「若有一只免子每 ...
- 【我的区块链之路】- golang实现主流查找算法
[转载请标明出处]https://blog.csdn.net/qq_25870633/article/details/82705217 查找算法相信各位大佬都不是很陌生吧!很多时候我们需要快速的从某些 ...
- 查找算法实现【C语言实现】
目录 1. 线性(顺序)查找法 2. 二分查找算法 3. 插值查找算法 4. 分块查找算法 1. 线性(顺序)查找法 查找算法是指:从一些数据之中,找到一个特殊的数据的实现方法.查找算法与遍历有极高的 ...
- 数据结构——四大查找算法(工作必备)
在java中,常用的查找有四种 顺序(线性)查找 二分查找折半查找 插值查找 斐波那契查找 目录 1. 线性查找 2. 二分查找 3. 插值查找 4. 斐波那契查找 1. 线性查找 线性查找是逐一比对 ...
- java快速查找算法_Java实现的快速查找算法示例
本文实例讲述了Java实现的快速查找算法.分享给大家供大家参考,具体如下: 快速查找算法,可以根据想要找的是第几个大的数,每次循环都能固定下来一个数在数组完整排完序之后的位置,每次循环都能定一个数的位 ...
- java 二分搜索获得大于目标数的第一位_程序员常用查找算法(顺序、二分、插值、分块、斐波那契)...
顺序查找 基本思想 属于线性查找和无序查找,从一端开始顺序扫描,直到找到与目标值value相等的元素. 这是最基本的查找方法,也是时间复杂度最高的查找算法. 在数据过多时,这种方法并不适用. 代码实现 ...
- 二分查找算法的一点改进
在计算机科学中,二分查找,是一种在有序数组中查找某一特定元素的搜索算法.这种搜索算法每一次比较都使搜索范围减半.第一篇二分查找的论文发表于1946年,然而第一个没有bug的二分查找算法却是在1962年 ...
- python二分法查找算法_顺序查找算法和折半(二分法)查找算法,C语言查找算法详解...
查找是指在大量的信息中寻找一个特定的信息.在计算机中,查找是非常重要的一个应用,比如"百度".查找算法的好坏直接影响查找的速度. 常用的查找算法主要有顺序查找和折半(二分法)查找: ...
- php查找二维数组下标,PHP实现二维数组中的查找算法小结
本文实例讲述了PHP实现二维数组中的查找算法.分享给大家供大家参考,具体如下: 方法1:silu从左下角最后一行的第一个元素开始,遍历.如果小于target 则遍历该行的所有元素,找到结束.如果大于继 ...
最新文章
- byte数组穿换成pcm格式_Apache Arrow:一种适合异构大数据系统的内存列存数据格式标准...
- Nature:拟南芥微生物组功能研究
- 如何让springboot中的某些html文件不经过thymeleaf模板解析?
- 对话系统(二)-普通神经网络
- 什么是 Webpack?【Webpack Book 翻译】
- 【mysql】【windows】MySQL 服务无法启动,服务没有报告任何错误,请键入 NET HELPMSG 3534 以获得更多的帮助。...
- 13.设计模式--外观模式(Facade模式)
- 使用uTools快捷地图片转文字
- R统计-PCA/PCoA/db-RDA/NMDS/CA/CCA/DCA等排序分析教程
- 微信添加好友查找失败服务器繁忙,微信加载联系人失败_微信添加好友失败有哪些原因...
- html5简单在线绘图,html5实现一个简单的在线画板
- maven 实战 (许晓斌)
- 4宫格 android,四宫格拼图软件
- php怎么实现网页切图,CSS_网站页面切图与CSS注意事项,一、Web页面切图
1) Web页面的 - phpStudy...
- Android基础入门教程——4.1.2 Activity初窥门径
- iOS开发之高仿斗鱼tv初探
- 服装标准中纰裂试验方法的比较与探讨
- Excel甘特图 Gantt Chart
- 【阅读笔记】Towards Efficient and Privacy-preserving Federated Deep Learning
- 通过一个命令返回上级多层目录的方法