一、C 程序实现
/*******************************************************************************************
*Description 斐波那契查找算法
*Author liaoxiongxiong
*Version 1.0
*Time 2018-06-28
*******************************************************************************************/
#include <stdio.h>
const int max_size=20;//斐波那契数组的长度
//生成斐波那契数列
void Fibonacci(int *f)
{
int i;
f[0] = 1;
f[1] = 1;
for(int i=2; i<max_size; i++)
f[i] = f[i-1] + f[i-2];
}
//斐波那契查找<br>//因为需要执行hight=mid-1、low=mid+1这样的操作所以实际数列为F[k]-1
int FibonacciSearch(int a[], int value, int n)
{
int i;
int low = 0;
int high = n-1;
int mid = 0;
int k = 0;
int F[max_size];
Fibonacci(F);//构造一个斐波那契数组F
while(n > F[k] - 1)//找出数组长度n在斐波数列(减1)中的位置,将决定如何拆分
k++; //此时F[k]-1>=n
int tmp[F[k]-1]; //创建一个F[k]-1大小的临时数组,因为原数组a[]太小
for(i=0; i<=high; i++)//将元素复制进临时数组tmp中
tmp[i] = a[i];
for(i=n; i<F[k]-1; i++)//若F[k]-1>n 则把数组补全,直到长度为F[k]-1
tmp[i] = a[high];
while(low <= high)
{
mid = low + F[k-1] -1;//根据斐波那契数列进行黄金分割
if(tmp[mid] > value)
{
high = mid-1;
k = k-1;
}
else if(tmp[mid] < value)
{
low = mid+1;
k = k-2;
}
else
{
if(mid <= high)//如果为真则找到相应的位置
return mid;
else
return -1;
}
}
return -1;
}
//测试用例
int main()
{
int a[]={0,1,2,3,4,5,6,7,8,9};
int len = sizeof(a)/sizeof(a[0]);
int x = 2; // 需要查找的元素
int i = FibonacciSearch(a, x, len-1);
if(i!=-1)
printf("元素 %d 在第 %d 个位置\n",x,i+1);
else
printf("没有找到元素:%d\n",x);
return 0;
}
运行结果:
二、Java 程序实现
import java.util.Arrays;
/**
* @description: 斐波那契查找算法
* @author:liaoxiongxiong
* @version : 1.0
* @date: 2018-06-29
*/
public class FibonacciSearch {
private static final int max_size = 20;//斐波那契数列长度
public static void fibonacci(int[] F)
{
int N = F.length;
F[0] = 1;
F[1] = 1;
for(int i=2; i<N; i++)
F[i] = F[i-1] + F[i-2];
}
public static int fibonacciSearch(int[] a, int value)
{
int N = a.length;
int low = 0;
int high = N-1;
int k = 0;
int[] F = new int[max_size];
fibonacci(F);
while(N > F[k]-1)
k++;
int[] tmp = Arrays.copyOf(a, F[k] - 1);// 构造一个长度为F[k] - 1的新数列
for(int i=N; i<F[k]-1; i++)
tmp[i] = a[high];
while(low<=high)
{
int mid = low + F[k-1]-1;
if(tmp[mid] > value)
{
high = mid-1;
k = k-1;
}
else if(tmp[mid] < value)
{
low = mid+1;
k = k-2;
}
else
{
if(low<=high)
return mid;
else
return -1;
}
}
return -1;
}
//测试用例
public static void main(String[] args)
{
int[] a={0,1,2,3,4,5,6,7,8,9};
int x=2; // 需要查找的元素
int i = fibonacciSearch(a, x);
if(i!=-1)
System.out.printf("元素 %d 在第 %d 个位置\n",x,i+1);
else
System.out.printf("没有找到元素:%d\n",x);
}
}
运行结果:
三、Python 程序实现
# -*- coding: utf-8 -*-
"""
Description: 斐波那契查找算法
Author: shujuxiong
Version: 1.0
Date: 2018-06-29
"""
import copy
def fibonacciSearch(lists, value):
#生成斐波那契数列
fib = [1, 1]
for i in range(1, 20):
fib.append(fib[-1] + fib[-2])
#确定数组长度在斐波那契数列中的位置
k = 0
n = len(lists)
while(n > fib[k]-1):
k = k+1
tmp = copy.deepcopy(lists) #临时数组
#将待查找数组填充到指定的长度
for i in range(n,fib[k]):
tmp.append(lists[-1])
low, high = 0, n-1
while(low <= high):
#获取黄金分割比例位置下标
mid = low + fib[k-1]-1
if(tmp[mid] > value):
high = mid-1
k = k-1
elif(tmp[mid] < value):
low = mid+1
k = k-2
else:
if low <= high:
return mid
else:
return -1
return -1
##测序用例
def main():
mylist = [0,1,2,3,4,5,6,7,8,9]
x = 2 #需要查找的元素
i = fibonacciSearch(mylist, x)
if i != -1:
print("元素 %d 在第 %d 个位置\n" % (x,i+1))
else:
print("没有找到元素:%d\n" % x)
if __name__=='__main__':
main()
运行结果: