查找算法-斐波那契(黄金分割法)查找
一、斐波那契(黄金分割法)查找介绍
二、斐波那契(黄金分割法)查找代码实现(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; } }
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· 没有源码,如何修改代码逻辑?
· NetPad:一个.NET开源、跨平台的C#编辑器