#include<stdio.h>
int Binary_Search(int *a,int n,int key)
{
int low,high,mid;
low=1;
high=n;
while(low<=high)
{
mid=(low+high)/2;
if(key<a[mid])
high=mid-1;
else if (key>a[mid])
low=mid+1;
else
return mid;
}
return 0;
}
int Interpolation_Search(int *a,int n,int key)//插值查找
{
int low,high,mid;
low=1;
high=n;
while(low<=high)
{
mid=low+(high-low)*(key-a[low])/(a[high]-a[low]);
//printf("%d\n",mid);
if(key<a[mid])
high=mid-1;
else if (key>a[mid])
low=mid+1;
else
return mid;
}
return 0;
}
int Fibonacci_Search(int *a,int n,int key)
{
int low,high,mid,i,k,j;
low=1;
high=n;
k=0;
int F[100];
F[0]=0;
F[1]=1;
printf("输入可能需要的斐波那契数列长度");
scanf("%d",&j);
if(j>=2)
{
for(i=2;i<=j;i++)
F[i]=F[i-2]+F[i-1];
}
while(n>F[k]-1)
k++;
for(i=n;i<F[k]-1;i++)
a[i]=a[n];
while(low<=high)
{
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
{
if(mid<=n)
return mid;
else
return n;
}
}
return 0;
}
int main()
{
int a[100];
int n,key,i,mid=0,o=0;
printf("数组大小:");
scanf("%d",&n);
printf("start puting\n");
for(i=0;i<=n;i++)
scanf("%d",&a[i]);
/* for(i=0;i<=n;i++)
printf("%d ",a[i]);*/
printf("输入key:");
scanf("%d",&key);
printf("1.折半查找\n");
printf("2.插值查找\n");
printf("3.Fibonacci查找\n");
while(scanf("%d",&o)!=EOF)
{
switch(o)
{
case 1:
{
mid=Binary_Search(a,n,key);
printf("%d\n",mid);
break;
}
case 2:
{
mid=Interpolation_Search(a,n,key);
printf("%d\n",mid);
break;
}
case 3:
{
mid=Fibonacci_Search(a,n,key);
printf("%d\n",mid);
break;
}
}
}
return 0;
}
有序表查找(折半,插值,斐波那契).c
最新推荐文章于 2025-04-09 14:15:04 发布