使用二分法进行查找返回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);
}
测试结果如下: