#include<cstdio> #include<cstdlib> #include<cstring> //折半查找 int Binary_Search(int *a,int n,int key){ int cnt = 0; int low,high,mid; low = 1; high = n; while(low <= high){ cnt++; mid = (low + high) >> 1; // 算术位运算 if(key < a[mid]) high = mid - 1; else if(key > a[mid]) low = mid + 1; else { printf("共查找了 %d 次\n",cnt); return mid; } } return 0; } //插值查找 int Binary_Search2(int *a,int n,int key){ int cnt = 0; int low,high,mid; low = 1; high = n; while(low <= high){ cnt++; mid = low + (high - low)*(key - a[low])/(a[high] - a[low]); if(key < a[mid]) high = mid - 1; else if(key > a[mid]) low = mid + 1; else { printf("共查找了 %d 次\n",cnt); return mid; } } return 0; } //斐波那契查找 int Fibonacci_Search(int *a,int n,int key){ int cnt = 0; int low,high,mid,i,k; int F[11] = {0,1,1,2,3,5,8,13,21,34,55}; low = 1; high = n; k = 0; while(n>F[k]-1) k++; for(i=n;i<F[k]-1;i++) a[i] = a[n]; //将不满的数值补全 while(low<=high){ cnt++; mid = low + F[k-1]-1; if(key<a[mid]){ high = mid-1; k = k -1; }else if(key>a[mid]){ low = mid+1; k = k-2; }else{ printf("共查找了 %d 次\n",cnt); if(mid<= n) return mid; else return n; } } return 0; } int main(){ int a[11] = {0,1,16,24,35,47,59,62,73,88,99}; printf("折半查找 59 的位置 %d\n\n",Binary_Search(a,10,59)); printf("插值查找 59 的位置 %d\n\n",Binary_Search2(a,10,59)); printf("斐波那契查找 59 的位置 %d\n\n",Fibonacci_Search(a,10,59)); return 0; }
时间: 2024-10-05 05:21:47