#include<iostream>
using namespace std;
#define MAXSIZE 20
//f斐波那契数列 {0,1,1,2,3,5,8,13,21,34}
//编写fibonacci数列,返回数组
int* fibonacci()
{
int * f = new int[MAXSIZE];
f[0] = 1;
f[1] = 1;
for (int i = 2; i < MAXSIZE; i++)
f[i] = f[i - 1] + f[i - 2];
return f;
}
//编写fibonacci查找算法
/*
* *a 查找的数组
* key 查找的值
*/
int FibSearch(int *a,int n ,int key) //成功返回下标,不成功返回-1
{
int *F = fibonacci(); //斐波那契数列
int low = 0;
int high = n;
int k = 0;
while (n > F[k] - 1) //计算n在斐波那契数列的位置
k++;
for (int i = n; i < F[k] - 1; i++) //将不满的数值用a数组的最大值不全
a[i] = a[high];
while (low <= high) //开始查找
{
int mid = low + F[k - 1] - 1; //计算当前分隔的下标
if (key < a[mid]) //查找记录小于当前分隔记录
{
high = mid - 1; //最高下标调整到分割下标mid-1处
k--; //斐波那契数列下标减一
}
else if (key > a[mid])
{
low = mid + 1;
k -= 2; //斐波那契数列下标减一
}
else //找到该值
{
if (mid <= n)
return mid;
else
return n; //mid>n,说明是补全数值,则返回n,即a的最大数值
}
}
return -1;
}
int main()
{
//测试fibonacci
/*int *arr = fibonacci();
for (int i = 0; i < _msize(arr) / sizeof(arr[0]); i++)
cout << arr[i] << endl;*/
int arr[] = { 1,3,4,6,7,9,11,15,16,20 };
int *a = new int[10];
for (int i = 0; i < 10; i++)
{
a[i] = arr[i];
}
cout << FibSearch(a, 16, 9);
delete a;//动态分配后释放
return 0;
}
http://blog.chinaunix.net/uid-27164517-id-3313988.html