查找算法-斐波那契(黄金分割法)查找

一、斐波那契(黄金分割法)查找介绍

 

 

二、斐波那契(黄金分割法)查找代码实现(Java)

复制代码
import java.util.Arrays;

public class FibonacciSearch {

    public static int maxSize = 20;
    public static void main(String[] args) {
        int[] arr = {1, 8, 10, 89, 1000, 1234};

        System.out.println("index=" + fibSearch(arr,1234));
    }

    //非递归方法得到一个斐波那契数列
    public static int[] fib() {
        int[] f = new int[maxSize];
        f[0] = 1;
        f[1] = 1;
        for (int i = 2; i < maxSize; i++) {
            f[i] = f[i - 1] + f[i - 2];
        }
        return f;
    }

    //编写斐波那契查找算法
    //使用非递归的方式编写算法
    /**
     *
     * @param a 数组
     * @param key 需要查找的关键码(值)
     * @return 返回对应的下标,如果没有-1
     */
    public static int fibSearch(int[] a, int key) {
        int low = 0;
        int high = a.length -1;
        int k = 0; //表示斐波那契分割数值的下标
        int mid = 0; //存放mid值
        int f[] = fib(); //获取到斐波那契数列
        //获取到斐波那契分割数值的下标
        while(high > f[k] - 1){
            k++;
        }
        //因为 f[k] 值 可能大于 a 的长度,因此需要使用Arrays类,
        //构造一个新的数组,并指向a[]
        //不足的部分会使用0填充
        int[] temp = Arrays.copyOf(a, f[k]);
        //实际上需求使用a数组最后的数填充 temp
        for (int i = high + 1; i < temp.length; i++) {
            temp[i] = a[high];
        }

        //使用while来循环处理,找到我们的数 key
        while(low <= high) { //只要这个条件满足,就可以找
            mid = low + f[k - 1] -1;
            if(key < temp[mid]){ //向数组的前面查找(左边)
                high = mid - 1;
                //为什么是 k--
                //说明
                //1.全部元素 = 前面的元素 + 后边元素
                //2.f[k] = f[k-1] + f[k-2];
                //因为前面有f[k-1]个元素,所以可以继续拆分f[k-1] = f[k-2] + f[k-3]
                //即 在 f[k-1] 的前面继续查找 k--
                //即下次循环 mid = f[k-1-1]-1
                k--;
            }else if(key > temp[mid]){//向数组的后面查找(右边)
                low = mid + 1;
                //为什么是 k -=2
                //说明
                //1.全部元素 = 前面的元素 + 后边元素
                //2.f[k] = f[k-1] + f[k-2]
                //3.因为后面我们有f[k-2] 所以可以继续拆分f[k-1] = f[k-3] + f[k-4];
                //4.即在f[k-2]的前面进行查找 K -=2
                //5.即下次循环mid = f[k - 1 - 2] -1;
                k -=2;
            }else{ //找到
                //需要确定,返回的是哪个下标
                if(mid <= high){
                    return mid;
                }else{
                    return high;
                }
            }
        }
        return -1;
    }
}
复制代码
posted @   狂热搬砖家  阅读(197)  评论(0编辑  收藏  举报
编辑推荐:
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· 没有源码,如何修改代码逻辑?
· NetPad:一个.NET开源、跨平台的C#编辑器
点击右上角即可分享
微信分享提示