zoukankan      html  css  js  c++  java
  • 斐波那契查找算法

    斐波那契查找的核心是:
      1)当key=a[mid]时,查找成功;
      2)当key<a[mid]时,新的查找范围是第low个到第mid-1个,此时范围个数为F[k-1] - 1个,即数组左边的长度,所以要在[low, F[k - 1] - 1]范围内查找;
      3)当key>a[mid]时,新的查找范围是第mid+1个到第high个,此时范围个数为F[k-2] - 1个,即数组右边的长度,所以要在[F[k - 2] - 1]范围内查找。

    代码如下:

     1 #include<stdio.h>
     2 #include<string.h>
     3 #include<math.h>
     4 #include<ctype.h>
     5 #include<stdbool.h>
     6 
     7 #define MAXSIZE 20
     8 
     9 void fibonacci(int *f)    //构建斐波那契序列
    10 {
    11     f[0] = 1;
    12     f[1] = 1;
    13     for(int i = 2; i < MAXSIZE; ++i)
    14         f[i] = f[i - 2] + f[i - 1];
    15 }
    16 
    17 int fibonacci_search(int *a,int key,int n)
    18 {
    19     int low = 0,high = n - 1;
    20     int mid = 0;
    21     int k = 0;
    22     int F[MAXSIZE];
    23     fibonacci(F);
    24     while(n > F[k] - 1) //计算出n在斐波那契中的位置
    25         ++k;
    26     for(int i = n; i < F[k] - 1; ++i) //把数组补全,使用a[n-1]
    27         a[i] = a[high];
    28     while(low <= high){
    29         mid = low + F[k-1] - 1;  //根据斐波那契数列进行黄金分割
    30         if(a[mid] > key){
    31             high = mid - 1;
    32             k = k - 1;
    33         }
    34         else if(a[mid] < key){
    35             low = mid + 1;
    36             k = k - 2;
    37         }
    38         else{
    39             if(mid <= high) //如果为真则找到相应的位置
    40                 return mid;
    41             else
    42                 return -1;
    43         }
    44     }
    45     return -1;
    46 }
    47 
    48 int main()
    49 {
    50     
    51     int a[MAXSIZE] = {5,15,19,20,25,31,38,41,45,49,52,55,57};
    52     int k;
    53     printf("请输入要查找的数字:\n");
    54     scanf("%d",&k);
    55     int pos = fibonacci_search(a,k,13);
    56     if(pos != -1)
    57         printf("在数组的第%d个位置找到元素:%d\n",pos + 1,k);
    58     else
    59         printf("未在数组中找到元素:%d\n",k);
    60     return 0;
    61 }
    作者:cpoint
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
  • 相关阅读:
    死锁
    不能复制文件到服务器
    JWT
    身份验证
    依赖注入
    ml.net
    swift 枚举、结构、类
    nginx 负载均衡
    sql 时间函数大全
    更新SVN时提示要清理,但清理失败,乱码得解决方案
  • 原文地址:https://www.cnblogs.com/cpoint/p/3367330.html
Copyright © 2011-2022 走看看