小白第一篇,有错误的话 希望多多指教;
/*!
* @file fibonacci_search.cpp
* @Date: 2018/01/21 21:36
* @author: sicaolong
* @Contact: sicaolong@163.com
* @brief: 第一点:确定k在f数列中的位置;
第二点:拓展a【n】至b[F[k]-1],b为一个新的数组;
第三点:计算当前分隔符的下标,这个最重要
* @TODO:
*/
#include<iostream>
using namespace std;
void creat_fibonacci();//创建一个Fibonacci数列(无返回值);
int Fibonacci_search(int *, int, int);//fibonacci查找函数;
int main()
{
int a[] = { 0, 16, 24, 35, 47, 59, 62, 73, 88, 99 };
int key = 59;
int index = Fibonacci_search(a, sizeof(a) / sizeof(int), key);
cout << key << " 在数组的第 " << index+1<<" 个位置上";
cout << endl;
return 0;
}
void creat_fibonacci(int *F)
{
F[0] = 0;
F[1] = 1;
int m = 20;
for (int i = 2; i < 20; ++i)
{
F[i] = F[i - 1] + F[i - 2];
}
cout << "fibonacci数列的前" << m << "个数据如下:" << endl;
for (int i = 0; i < 20; ++i)
{
cout << F[i] << " ";
}
cout << endl;
}
int Fibonacci_search(int *a, int n, int key)
{
const int m = 20;
int mid;//分隔得下标
int low = 0;
int high = n-1;
int k = 0;//fibonacci数列的下表从0开始
int F[m];
creat_fibonacci(F);
while (n>F[k]-1)// 第一点:确定k在f数列中的位置;
{
++k;
}
int *b = new int[F[k] - 1];// 第二点 拓展a【n】至b[F[k]-1],b为一个新的数组;
memcpy(b, a, 80);//将a的前n个数据拷贝到b的前n个数据中
for(int i = n; i < F[k] - 1;i++)//b[n]至b[f[k]-1]个数据赋值为a[n-1];
{
b[i] = a[n-1];
}
while (low<=high)//成立条件;
{
mid = low + F[k - 1] - 1;// 第三点计算当前分隔符的下标,这个最重要
if (key<b[mid])
{
high = mid - 1;
k = k - 1;
}
else if (key>b[mid])
{
low = mid + 1;
k = k - 2;
}
else
{
if (mid <= n)
return mid;//mid在 n内,返回mid值
else
return n;//mid在n之外,返回n值
}
}
return 0;
delete[]b;//删除动态数组 new int b[]
}
希望多多学习;共同进步