C语言插值查找法


#C语言


== 插值查找法 ==
插值查找法是二分查找法的加强版,二分法总是以二分之一这一固定的比例进行查找,插值法则能够自适应的改变这个比例,相比二分法,插值法就只有一行代码不一样。博主之前看插值法,看的是这篇文章: >https://www.cnblogs.com/leezx/p/5719012.html ,但是博主发现这个公式有bug,而且其他小伙伴也都是用的这个公式,网上大部分都是借助的这个公式。搞得博主之前莫名其妙,不废话,直接贴代码:

#include <stdio.h>

int Insert_Search(int *num,int cnt,int target)
{
	int first=0,last=cnt-1,mid;
	int counter = 0;
	while(first <= last)
	{
		counter ++;
		mid = first+(target-num[first])*(last-first)/(num[last]+num[first]);	
		if(num[mid] > target)
		{
			last = mid-1; //mid已经交换过了,last往前移一位
		}
		else if(num[mid] < target)
		{
			first = mid+1;//mid已经交换过了,first往后移一位
		}	
		else 
		{
			printf("查找次数:%d\n",counter);
			return 1;
		}
		
	}
	printf("查找次数:%d\n",counter);
	return 0;
}

int main(void)
{
	int flag = 0,target;
	int num[10] = {1,2,3,4,5,6,7,8,70,100};
	while(1)
	{
		printf("请输入您要查找的数字:\n");
		scanf("%d",&target);
		flag = Insert_Search(num,10,target);
		if(flag) printf("已经找到该数字!!\n");
		else printf("无该数字!!\n");
	}
}

说明:mid = first+(target-num[first])*(last-first)/(num[last]+num[first]);这一行代码,原来公式是 mid = first+(target-num[first])*(last-first)/(num[last]-num[first]);若是后者,查找时会出现问题,就一个符号的差别。
运行程序,结果如下:

这里写图片描述

博主用二分法查找相同的元素(数组内容相同),结果如下;
这里写图片描述

所以:对于表长较大,而关键字分布又比较均匀的查找表来说,插值查找算法的平均性能比折半查找要好的多。反之,数组中如果分布非常不均匀,那么插值查找未必是很合适的选择。(引自 https://www.cnblogs.com/leezx/p/5719012.html)。

以上若有错误,欢迎评论!!!

  • 4
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

追代码的人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值