如何用C语言实现斐波那契查找算法

如何用C语言实现斐波那契查找算法

问题描述

斐波那契查找(Fibonacci Search)是一种在有序数组中查找目标元素的算法,它的基本思想是:利用斐波那契数列的特性,将数组分割成两个子数组,其中一个子数组的长度是斐波那契数列中的某一项,另一个子数组的长度是斐波那契数列中的前一项,然后根据目标元素和分割点的大小关系,缩小查找的范围,继续在相应的子数组中进行斐波那契查找,直到找到目标元素或查找失败为止。

解决方案和代码

斐波那契查找的核心是分割(split)操作,即在每次查找时,根据斐波那契数列的规律,计算分割点的位置,和目标元素进行比较,然后根据比较的结果,继续在左半部分或右半部分进行斐波那契查找,直到找到目标元素或左右边界相交时停止。

以下是用C语言实现的斐波那契查找算法的代码,其中fib函数用于生成斐波那契数列,fib_search函数用于在数组中进行斐波那契查找,返回目标元素的位置,如果不存在,返回-1。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

// 生成斐波那契数列,n为数组的长度
int* fib(int n) {
    int* f = (int*)malloc(sizeof(int) * n); // 分配动态数组空间
    f[0] = 0; // 第一个元素为0
    f[1] = 1; // 第二个元素为1
    for (int i = 2; i < n; i++) { // 从第三个元素开始,每个元素为前两个元素之和
        f[i] = f[i - 1] + f[i - 2];
    }
    return f; // 返回斐波那契数列
}

// 斐波那契查找,n为数组的长度
int fib_search(int arr[], int n, int target) {
    int* f = fib(n); // 生成斐波那契数列
    int low = 0; // 左边界
    int high = n - 1; // 右边界
    int k = 0; // 斐波那契分割数值下标
    while (n > f[k] - 1) { // 计算n位于斐波那契数列的位置
        k++;
    }
    int* temp = (int*)malloc(sizeof(int) * f[k]); // 扩展数组到f[k]的长度
    memcpy(temp, arr, n * sizeof(int)); // 拷贝原数组到temp
    for (int i = n; i < f[k]; i++) { // 对于新增的元素,赋值为原数组的最后一个元素
        temp[i] = arr[n - 1];
    }
    while (low <= high) { // 当左右边界没有相交时
        int mid = low + f[k - 1] - 1; // 计算分割点的位置
        if (target < temp[mid]) { // 如果目标元素小于分割点的元素
            high = mid - 1; // 更新右边界为分割点的左边
            k = k - 1; // 更新斐波那契分割数值下标
        } else if (target > temp[mid]) { // 如果目标元素大于分割点的元素
            low = mid + 1; // 更新左边界为分割点的右边
            k = k - 2; // 更新斐波那契分割数值下标
        } else { // 如果目标元素等于分割点的元素
            if (mid < n) { // 如果分割点在原数组范围内
                return mid; // 返回分割点的位置
            } else { // 如果分割点在扩展数组范围内
                return n - 1; // 返回原数组的最后一个元素的位置
            }
        }
    }
    return -1; // 如果没有找到目标元素,返回-1
}

int main() {
    // 定义一个有序的数组
    int arr[] = {1, 3, 5, 7, 9, 11, 13, 15, 17, 19};
    // 获取数组的长度
    int n = sizeof(arr) / sizeof(arr[0]);
    // 定义一个目标元素
    int target = 13;
    // 调用斐波那契查找函数,返回目标元素的位置
    int index = fib_search(arr, n, target);
    // 打印结果
    if (index == -1) {
        printf("没有找到目标元素\n");
    } else {
        printf("目标元素在数组中的位置是%d\n", index);
    }
    // 返回0
    return 0;
}

运行结果:

总结

斐波那契查找是一种基于有序数组的查找算法,它的优点是速度快,时间复杂度为O(logn),缺点是要求数组必须是有序的,且需要额外的空间存储斐波那契数列。它的关键是利用斐波那契数列的性质,计算分割点的位置,和目标元素进行比较。斐波那契查找是一种改进的二分查找算法,它在实际应用中有很多优化,例如黄金分割查找,它将分割点的位置固定为0.618的比例。

  • 8
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值