C语言插值查找法


#C语言


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

#include 

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]);若是后者,查找时会出现问题,就一个符号的差别。
运行程序,结果如下:

C语言插值查找法_第1张图片

博主用二分法查找相同的元素(数组内容相同),结果如下;
C语言插值查找法_第2张图片

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

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

你可能感兴趣的:(C语言)