【数据结构与算法】【查找】斐波那契查找的代码实现
2014-11-04 23:15
597 查看
斐波那契查找(Fibonacci Search):基于折半查找,对于mid的选择,使用斐波那契数组进行了调整。
mid计算公式:mid = low + F[k - 1] - 1
斐波那契数组计算公式:
F[K] = F[k - 1] + F[K - 2]
F[k] - 1 = (F[k - 1] - 1) + 1 + (F[k - 2] - 1)
优劣势分析:mid左侧的元素个数大于右侧的元素个数。所以,如果要查找的记录在右侧,则左侧的数据就不需要比较了,效率比较高;如果要查找的记录在左侧,则效率比较低。
代码实现:
mid计算公式:mid = low + F[k - 1] - 1
斐波那契数组计算公式:
F[K] = F[k - 1] + F[K - 2]
F[k] - 1 = (F[k - 1] - 1) + 1 + (F[k - 2] - 1)
优劣势分析:mid左侧的元素个数大于右侧的元素个数。所以,如果要查找的记录在右侧,则左侧的数据就不需要比较了,效率比较高;如果要查找的记录在左侧,则效率比较低。
代码实现:
// Filename: fibonacci_search.c #include <stdio.h> #include <stdlib.h> #include <stdbool.h> #include "public.h" // 计数器,评估性能使用 extern int count; // 斐波那契数组 int F[47]; void InitF() { int i; F[0] = 0; F[1] = 1; for (i = 2; i < sizeof(F) / sizeof(int); i++) { F[i] = F[i - 1] + F[i - 2]; } //printf("斐波那契数组: "); //PrintArray(F, sizeof(F) / sizeof(int)); //printf("\n"); return; } // 插值查找 // a 为待查找数组,a[0]不使用,n为数组长度(不包含a[0]) // 查找成功,则返回key所在的地址;查找失败,则返回0 int FibonacciSearch(int a[], int n, int key) { int low = 1, high = n, mid, i, k = 0; count = 0; // 计算n位于斐波那契数列的位置 while (n > F[k] -1) { k++; } // 将待查找数组的长度不足至F[k]-1长度 for (i = n + 1; i <= F[k] -1; i++) { a[i] = a ; } while (low <= high) { count++; mid = low + F[k -1] -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; } else { return n; } } } return 0; } // 斐波那契查找主函数 int FibonacciSearchMain() { int value; int retval; int arr[20] = {0xFF, 1, 16, 24, 35, 47, 59, 62, 73, 88, 99, -1}; printf("斐波那契查找演示(a[0]未使用,不参与排序): \n"); printf("静态查找表数据:\n"); PrintArray(arr, sizeof(arr) / sizeof(int)); printf("\n"); // 初始化斐波那契数组 InitF(); while (1) { // 查找元素 printf("请输入要查找的数据: \n"); scanf("%d", &value); // 退出查找 if (0xFF == value) break; retval = FibonacciSearch(arr, 10, value); if (0 == retval) { printf("查找失败! 总计比较次数: %d.\n", count); } else { printf("查找成功,元素所在位置: %d. 总计比较次数: %d.\n", retval, count); } } return 0; }
相关文章推荐
- 【数据结构与算法】【查找】顺序查找(线性查找)的代码实现
- 【数据结构与算法】【查找】折半查找(二分查找)的代码实现
- 【数据结构与算法】【查找】插值查找的代码实现
- 【数据结构与算法】【查找】哈希表的代码实现
- 【数据结构作业一】写出顺序表的结构体类型定义及查找、插入、删除算法,并以顺序表作存储结构,实现线性表的插入、删除
- 【数据结构与算法】【排序】快速排序的代码实现
- 数据结构与算法13:折半查找、差值查找和斐波那契查找
- 算法——数据结构图的最短路径实现JAVA代码
- 【数据结构与算法】斐波那契额数列用for循环实现
- 常用查找数据结构及算法(Python实现)
- 详解常用查找数据结构及算法(Python实现)
- 常用查找数据结构及算法(Python实现)
- 详解常用查找数据结构及算法(Python实现)
- 【数据结构与算法】【排序】堆排序的代码实现
- 数据结构之---C语言实现斐波那契查找
- 数据结构与算法笔记 —— 排序算法及代码实现
- 【数据结构与算法】【排序】希尔排序的代码实现
- 数据结构算法代码实现——线性表的链式表示与实现(单链表)(三 )
- 看数据结构写代码(53) 静态查找表(线性查找,二分查找,斐波那契查找,插值查找)
- 数据结构与算法-查找-斐波那契查找