斐波那契查找
斐波那契数列(F[k]): 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89…… n 等于数组的长度 k为斐波那契数列中刚好大于n的数所在数组的下标.
class Program
{
static int count = 20;
static int[] test = { 1, 5, 15, 22, 25, 31, 39, 42, 47, 49, 59, 68, 88 };
static int[] fibo = new int[20];
//生成斐波那契数组
static void Fibonacci(int[] vs,int num)
{
vs[0] = 1;
vs[1] = 1;
for (int i = 2; i < num; i++)
{
vs[i] = vs[i - 2] + vs[i - 1];
}
}
//使用斐波那契数组,切割查找对象所在的数组后,找到它
static int FindIndex(int[] source,int key)
{
int k = 0;
int mid = (int)(source.Length*0.618f);
int max = source.Length;
int min = 0;
while(max > fibo[k] - 1)
{
++k;
}
while (min <= max)
{
if (source[mid] > key)
{
max = mid - 1;
if(fibo[k - 1] - 1 > min)
{
k = k - 1;
mid = fibo[k - 1];
}
else
{
--mid;
}
}
else if (source[mid] < key)
{
min = mid + 1;
if (fibo[k + 1] < max)
{
k = k + 1;
mid = fibo[k + 1];
}
else
{
++mid;
}
}
else
{
if (mid<=max)
{
return mid;
}
else
{
return max;
}
}
}
return -1;
}
static void Main(string[] args)
{
Fibonacci(fibo, count);
int index;
index = FindIndex(test, 25); //要查找的对象.
if (index != -1)
{
Console.WriteLine("Index==" + index);
}
}
}