所以我编写了一个二进制搜索函数,它接受一个整数数组,一个低索引搜索值,一个高索引搜索值和一个检查值:
int binarySearch(int d[], int low, int high, int check)
{
int mid = (high-low)/2 + low;
if(low > high)
return -1;
if(d[mid] == check)
return mid;
else if(check > d[mid])
return binarySearch(d, mid+1, high, check);
else
return binarySearch(d, low, mid-1, check);
}
但是,我被要求编写一个二进制搜索函数,只接受数据数组,数组长度和搜索值?如果没有低变量和高变量,我怎么能这样做呢?我怎样才能在大小方面声明低变量和高变量?
int binSearch(int d[], int size, int check)
答案 0 :(得分:1)
这取决于语言。
在C中,可以通过更改指向数组头部的指针,而不是考虑完整数组,只考虑它的后半部分。
if in 1st half:
arr = arr // unchanged
size = size/2 //only the size and thus end point change
if in 2nd half:
arr = arr + size/2 //only the 2nd half is considered
size = size/2 //and size is also changing
从递归调用返回时,您当然需要将第二种情况中添加的差距添加到答案中。
在java中,你不能真正有效地做到这一点(假设你仍然想要一个递归的二进制搜索),因为数组是一个你不能(很好)只是改变起点的对象。您当然可以创建相关子阵列的副本 - 但这将失去二进制搜索的效率。
答案 1 :(得分:1)
您可以将函数重写为循环,其中递归替换为使用其他变量值通过循环的另一次传递。循环变量可以是局部变量,不必在界面中公开。在对二进制搜索函数的递归调用中,您只需调整其中一个参数low
或high
,这样就可以轻松地重写函数:
int binarySearch(int d[], int length, int check)
{
int low = 0;
int high = length;
while (low < high) {
int mid = (high - low) / 2 + low;
if (d[mid] == check) return mid;
if (check > d[mid]) {
low = mid + 1;
} else {
high = mid;
}
}
return -1;
}
请注意,我使用稍微不同的方式来描述当前搜索的子数组:low
是包含的下限,但上限high
是独占的。这是使用从零开始的数组索引的语言中范围的自然表示。然后由low == high
重复空子阵列。
答案 2 :(得分:0)
这很简单 - 事实上,你差不多完成了:你需要的只是一个围绕你的递归函数的单行包装器,它将四参数函数转换成三参数函数。
编写与所需签名匹配的函数:
int binSearch(int d[], int size, int check) {
return binarySearch(d, 0, size-1, check);
}
当然,您也可以使用指针:不要将low
作为单独的参数传递,而是可以将&d[low]
作为新的d
和high-low
传递长度。