【查找】插值查找

插值查找
插值查找法的算法思想:插值查找法其实就是折半查找法的加强优化版,它对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,才为元素的位置。

猜你喜欢

转载自blog.csdn.net/weixin_44321600/article/details/86671727