首页 > 其他分享 >插值查找——C语言描述

插值查找——C语言描述

时间:2023-03-11 21:44:34浏览次数:49  
标签:Arr ---------- 插值 C语言 ------- int 查找 Low Test

插值查找——C语言描述

目录

0 测试用例框架

https://blog.csdn.net/m0_59469991/article/details/127137119?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22127137119%22%2C%22source%22%3A%22m0_59469991%22%7D

1 定义

​ 使用线性插值法查找,使用二分查找的代码,中间的Mid 改为 Low + ((High – Low) / (Arr[High] – Arr[Low])) * (SearchValue – Arr[Low]);

注意:

① 如果只有一个元素的情况要单独列出来,为了避免插值参数的分母为0;

② 时间复杂度还是为logn,对于要的值均匀分布的情况,采用插值查找效率高.

2 代码

/*InterpolationSearch*/
int InterpolationSearch(int *Arr, int Num, int SearchValue) {
	int Low = 0;
	int High = Num - 1;
	int Mid;

	if ((Arr == NULL) || (Num <= 0) || (SearchValue < Arr[Low]) || (SearchValue > Arr[High])) {
		return -1;
	}

	if (Num == 1) {
		return 0;
	}

	while (Low < High) {
		Mid = Low + (int)(((SearchValue - Arr[Low]) / (Arr[High] - Arr[Low])) * (High - Low));
		if (SearchValue < Arr[Mid]) {
			High = Mid - 1;
		} else if (SearchValue > Arr[Mid]) {
			Low = Mid + 1;
		} else {
			return Mid;
		}
	}

	return -1;
}

4 测试用例

/*InterpolationSearch*/
void TesInterpolationSearchSearch(void) {
	/*Test01: Normal*/
	int Arr01[] = { 0, 1, 2, 3, 4, 5 };
	int SearchValue01 = 2;
	int Res01 = 0;
	int CmpRes01 = 2;
	int Num01 = 6;

	/*Test02: Bounary*/
	int Arr02[] = { 0, 1, 2, 3, 4, 5 };
	int SearchValue02 = 0;
	int Res02 = 0;
	int CmpRes02 = 0;
	int Num02 = 6;

	/*Test03: Bounary*/
	int Arr03[] = { 0, 1, 2, 3, 4, 5 };
	int SearchValue03 = 5;
	int Res03 = 0;
	int CmpRes03 = 5;
	int Num03 = 6;

	/*Test04: Don't exit*/
	int Arr04[] = { 0, 1, 2, 3, 4, 5 };
	int SearchValue04 = 7;
	int Res04 = 0;
	int CmpRes04 = -1;
	int Num04 = 6;

	/*Test05: Only a Mem and exit*/
	int Arr05[] = { 0 };
	int SearchValue05 = 0;
	int Res05 = 0;
	int CmpRes05 = 0;
	int Num05 = 1;

	printf("-------Test start----------\n");
	InitNum();

	/*Test01*/
	printf("\n-------Test 01----------\n");
	Res01 = InterpolationSearch(Arr01, Num01, SearchValue01);
	TestCmpRes(CmpRes01, Res01);

	/*Test02*/
	printf("\n-------Test 02----------\n");
	Res02 = InterpolationSearch(Arr02, Num02, SearchValue02);
	TestCmpRes(CmpRes02, Res02);

	/*Test03*/
	printf("\n-------Test 03----------\n");
	Res03 = InterpolationSearch(Arr03, Num03, SearchValue03);
	TestCmpRes(CmpRes03, Res03);

	/*Test04*/
	printf("\n-------Test 04----------\n");
	Res04 = InterpolationSearch(Arr04, Num04, SearchValue04);
	TestCmpRes(CmpRes04, Res04);

	/*Test05*/
	printf("\n-------Test 05----------\n");
	Res05 = InterpolationSearch(Arr05, Num05, SearchValue05);
	TestCmpRes(CmpRes05, Res05);

	/*Test Result*/
	printf("\n-------Test result----------\n");
	TestResult();
}

打印结果

-------Test start----------

-------Test 01----------

-------Test 02----------

-------Test 03----------

-------Test 04----------

-------Test 05----------

-------Test result----------

Print test result;

TestNum = 5, PassNum = 5, FaildNum = 0

标签:Arr,----------,插值,C语言,-------,int,查找,Low,Test
From: https://www.cnblogs.com/meditatorss/p/17207066.html

相关文章

  • C语言读写表格文件
    1.csv文件简介  逗号分隔值(Comma-SeparatedValues,CSV,有时也称为字符分隔值,因为分隔字符也可以不是逗号),其文件以纯文本形式存储表格数据(数字和文本)。纯文本意味着该文件是......
  • c语言 -我与letcode相爱相杀
    有人相爱,有人夜里开车看海,有人leetcode第一题都做不出来。1.两数之和给定一个整数数组nums 和一个整数目标值target,请你在该数组中找出和为目标值target 的那 ......
  • 二分法查找
    原理一个数据有升序的数组,每次取中间元素比较,如果大于需要查找的元素,则去后面数据,中间数据作为起点最后数据作为终点再定中间数据比较。如果小于需要查找的数据,则取前面......
  • 我的c语言笔记
    1.进制转换二进制、八进制和十六进制向十进制转换都非常容易,就是“按权相加”。如:1010.1101=1×23 +0×22 +1×21 +0×20 +1×2-1 +1×2-2 +0×2-3 +1......
  • 浙大版《C语言程序设计(第3版)》题目集 习题5-1 符号函数
    本题要求实现符号函数sign(x)。函数接口定义:intsign(intx);其中​​x​​是用户传入的整型参数。符号函数的定义为:若​​x​​大于0,​​sign(x)​​ = 1;若​​x​​等......
  • 浙大版《C语言程序设计(第3版)》题目集 习题5-1 符号函数
    本题要求实现符号函数sign(x)。函数接口定义:intsign(intx);其中​​x​​是用户传入的整型参数。符号函数的定义为:若​​x​​大于0,​​sign(x)​​ = 1;若​​x​​等......
  • 浙大版《C语言程序设计(第3版)》题目集 习题5-1 符号函数
    本题要求实现符号函数sign(x)。函数接口定义:intsign(intx);其中​​x​​是用户传入的整型参数。符号函数的定义为:若​​x​​大于0,​​sign(x)​​ = 1;若​​x​​等......
  • 浙大版《C语言程序设计(第3版)》题目集 习题5-1 符号函数
    本题要求实现符号函数sign(x)。函数接口定义:intsign(intx);其中​​x​​是用户传入的整型参数。符号函数的定义为:若​​x​​大于0,​​sign(x)​​ = 1;若​​x​​等......
  • 浙大版《C语言程序设计(第3版)》题目集 习题5-1 符号函数
    本题要求实现符号函数sign(x)。函数接口定义:intsign(intx);其中​​x​​是用户传入的整型参数。符号函数的定义为:若​​x​​大于0,​​sign(x)​​ = 1;若​​x​​等......
  • 浙大版《C语言程序设计(第3版)》题目集 习题5-1 符号函数
    本题要求实现符号函数sign(x)。函数接口定义:intsign(intx);其中​​x​​是用户传入的整型参数。符号函数的定义为:若​​x​​大于0,​​sign(x)​​ = 1;若​​x​​等......