二进制搜索只使用长度?

时间:2015-05-12 12:10:12

标签: arrays algorithm search binary

所以我编写了一个二进制搜索函数,它接受一个整数数组,一个低索引搜索值,一个高索引搜索值和一个检查值:

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)

3 个答案:

答案 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)

您可以将函数重写为循环,其中递归替换为使用其他变量值通过循环的另一次传递。循环变量可以是局部变量,不必在界面中公开。在对二进制搜索函数的递归调用中,您只需调整其中一个参数lowhigh,这样就可以轻松地重写函数:

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]作为新的dhigh-low传递长度。