斐波那契查找的核心是:
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 }