【查找】插值查找

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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值