插值查找
插值查找法的算法思想:插值查找法其实就是折半查找法的加强优化版,它对mid的算法进行了重新的规定,使此查找法的效率更高。
mid=low+(high-low)*(key-a[low])/(a[high]-a[low])
插值查找法的算法可描述如下:
int search(keytype key[],int n,keytype k)
{
int low=0,high=n-1,mid;
while(low<=high)
{
mid=low+(high-low)*(key-key[low])/(key[high]-key[low]);
if(key[mid]==k)
return mid; //查找成功,返回mid
if(k>key[mid])
low=mid+1; //在后半序列中查找
else
high=mid-1; //在前半序列中查找
}
return -1; //查找失败,返回-1
}
其余具体的算法与折半查找法相同,详见折半查找:
https://blog.csdn.net/weixin_44321600/article/details/86671672
【实例】
有一个数组A[10],里面存放了10个整数,顺序递增。任意输入一个数字n,找到n在数组中的位置。如果n不属于该数组A,显示错误提示。
A[10]={1,3,5,7,9,12,15,17,23,31}
【分析】
#include<stdio.h>
int search(int A[],int n,int key)
{
int low=0,high=n-1,mid;
if(A[low]==key)
return low;
else if(A[high]==key)
return high;
else
{
while(low<=high)
{
mid=low+(high-low)*(key-A[low])/(A[high]-A[low]);
if(A[mid]==key)
return mid; //查找成功,返回mid
if(key>A[mid])
low=mid+1; //在后半序列中查找
else
high=mid-1; //在前半序列中查找
}
}
return -1; //查找失败,返回-1
}
main()
{
int A[10]={1,3,5,7,9,12,15,17,23,31},i,n,addr;
printf("A[10]:");
for(i=0;i<10;i++)
printf("%d ",A[i]); //显示数组A的内容
printf("\n输入要查找元素:");
scanf("%d",&n); //输入待查找元素
addr=search(A,10,n); //折半查找返回该元素在数组中的下标
if(addr!=-1) //查找成功
printf("%d是数组中的第%d个元素",n,addr+1);
else //查找失败
printf("A数组中无%d",n);
return 0;
}
运行结果如图所示:
注意:数组的下标从0开始,故要在原返回值上+1,才为元素的位置。