费氏搜寻法
使用费氏数列 1 1 2 3 5 8 13 构成的数列,切割范围来进行查找
public class FSearch {
public static int Max = 20;
public static int[] Data = { 12, 16, 19, 22, 25, 32, 39, 48, 55, 57, 58,
63, 68, 69, 70, 78, 84, 88, 90, 97 }; // 数据数组
public static int Counter = 1; // 计数器
public static void main(String args[])
{
int FinA; // 费氏数
FinA = 1; // 定义费氏数
while (Fib(FinA) <= Max)
FinA++;
int KeyValue = 32;
// 调用费氏查找
if (FibonacciSearch(FinA, KeyValue))
{
// 输出查找次数
System.out.println("");
System.out.println("Search Time = " + (int) Counter);
}
else
{
// 输出没有找到数据
System.out.println("");
System.out.println("No Found!!");
}
}
// ---------------------------------------------------
// 递归求费氏级数
// ---------------------------------------------------
public static int Fib(int N)
{
if (N <= 1) // 递归结束条件
return N;
else
return Fib(N - 1) + Fib(N - 2); // 递归执行部分
}
// ---------------------------------------------------
// 费氏查找法
// ---------------------------------------------------
public static boolean FibonacciSearch(int n, int KeyValue)
{
int Root; // 左边界变量
int Distance_1; // 上一个费氏数
int Distance_2; // 上二个费氏数(差值)
int Temp; // 数据暂存变量
Root = Fib(n - 1);
Distance_1 = Fib(n - 2);
Distance_2 = Fib(n - 3);
do
{
if (KeyValue < Data[Root - 1]) // 欲查找值较小
{ // 查找前半段
Root = Root - Distance_2;
Temp = Distance_1;
Distance_1 = Distance_2;
Distance_2 = Temp - Distance_2;
}
// 欲查找值较大
else if (KeyValue > Data[Root - 1])
{ // 查找后半段
Root = Root + Distance_2;
Distance_1 = Distance_1 - Distance_2;
Distance_2 = Distance_2 - Distance_1;
}
else if (KeyValue == Data[Root - 1]) // 查找到数据
{
System.out.println("Data[" + (Root - 1) + "] = "
+ Data[Root - 1]);
return true;
}
Counter++;
} while (Distance_2 >= 0);
return false;
}
}