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