Java算法之 费氏搜寻法

费氏搜寻法 

使用费氏数列  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;
 }
}

 

转载于:https://my.oschina.net/90888/blog/881999

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值