C++ 二分法算法查找返回Array最近的值

使用二分法进行查找返回Array最近值,支持float类型、int类型等各种数据类型

template<typename T>//二分法查找,返回一个最近的值出来
T binary_search(T* Array, int Length, T k)
{
	sort(Array, Array + Length);//先排序
	int l = 0, r = Length;//要搜索的数组长度为Length
	while (r > l)
	{
		//int mid = (l + r) / 2;//若l和r过大,则会存在两数相加超出数据限制的情况
		int mid = l + (r - l) / 2;//改成这种写法,则会避免两个大数直接相加

		if (Array[mid] == k)//当查询到了你要找的数k  
		{
			//return true;//返回值为真
			printf("In vector!\n");
			printf("L:%d\tR:%d\n", l, r);
			cout << "L:" << Array[l] << "R:" << Array[r] << endl;
			//return true;//返回值为真
			return Array[mid];//返回值为真
		}
		else if (Array[mid] < k)
		{
			//l = mid;这种写法具有局限性,会出现死循环的情况
			l = mid + 1;//这种写法可以避免死循环
		}
		else
		{
			r = mid;
		}
	}
	printf("Not in vector!\n");
	printf("L:%d\tR:%d\n", l, r);
	cout << "L:" << Array[l] << "R:" << Array[r] << endl;
	if (l == r)
	{//有可能L和R相等,也有可能是L大于R。在L、L+1、L-1三个里面对比,选择最近值
		if (fabs(Array[l - 1] - k) < fabs(Array[l] - k))
		{
			if (fabs(Array[l - 1] - k) < fabs(Array[l + 1] - k))
			{
				cout << "Num:" << l - 1 << "MinValue:" << Array[l - 1] << "MinError:" << fabs(Array[l - 1] - k);
				return Array[l - 1];
			}
			else
			{
				cout << "Num:" << l + 1 << "MinValue:" << Array[l + 1] << "MinError:" << fabs(Array[l + 1] - k);
				return Array[l + 1];
			}
		}
		else
		{
			if (fabs(Array[l] - k) < fabs(Array[l + 1] - k))
			{
				cout << "Num:" << l << "MinValue:" << Array[l] << "MinError:" << fabs(Array[l] - k);
				return Array[l];
			}
			else
			{
				cout << "Num:" << l + 1 << "MinValue:" << Array[l + 1] << "MinError:" << fabs(Array[l + 1] - k);
				return Array[l + 1];
			}
		}
	}
	else
	{
		printf("L bigger R!,目前没有遇到,懒得完善\n");
	}

	return 0;//找不到则返回值为假
}

测试主函数:


int main()
{
	//定义数组
	double list[] = { 0.3124,0.35,0.678,0.56,1.768,2.674,0.0034,0.782,0.23,0.4 };
	printf("排序前:\n");
	for (int i = 0; i < 10; i++)
	{
		cout << list[i] << " ";
	}
	cout << endl;
	//对数组排序
	//sort(list, list + 10);    //8为数组元素个数

	printf("排序后:\n");
	for (int i = 0; i < 10; i++)
	{
		cout << list[i] << " ";
	}
	cout << endl;
	double K = 0.31;//待查找值。使用了0.31、0.32、0.6、0.35进行了测试,结果如下
	printf("Find Num:%lf\n",K);
	//binary_search(list,9,0.32);
	binary_search(list,10,K);
}

测试结果如下:
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值