【发布时间】:2021-03-31 16:23:14
【问题描述】:
我尝试使用递归二进制搜索算法返回数组元素的正确索引,但它只返回所考虑部分的索引。
例如,如果列表由名称“Grant”、“Anthony”和“Samuel”组成,如果我搜索“Samuel”,算法将返回值 0。
short binarySearch(person key, person list[], short n)
{
size_t mid;
if(n == 0)
return -1;
mid = (n-1)/2;
if(strcmp(key.name, list[mid].name) == 0 && strcmp(key.surname, list[mid].surname) == 0)
return mid;
else if(strcmp(key.name, list[mid].name) < 0)
return binarySearch(key, list, mid);
else
return binarySearch(key, list+mid+1, n-mid-1);
}
更新:
我以这种方式解决了(感谢@mevets 和@selbie):
int binarySearch(person key, person *list, size_t n)
{
int cmp = 0, result;
size_t mid;
if(n == 0)
return -1;
mid = (n - 1) / 2;
cmp = strcmp(key.name, list[mid].name);
if(cmp == 0)
{
cmp = strcmp(key.surname, list[mid].surname);
if(cmp == 0)
return mid;
}
if(cmp < 0)
return binarySearch(key, list, mid);
result = binarySearch(key, list+mid+1, n-mid-1);
if(result == -1)
return -1;
return 1 + mid + result;
}
【问题讨论】:
-
程序中的一个小错误 - 如果列表中的两个项目具有相同的
name属性值,但不同的surname值,您可能会递归错误的子数组。考虑数组[{"bob", "anderson"}, {"bob", "jones"}, {"bob, "zumuda"}]。然后搜索"bob anderson"。 -
这当然假设您的物品是按名字和姓氏排序的。如果项目是按姓氏排序的,仍然存在类似的错误。我将在下面更新我的答案以显示修复。