卡在cs50 pset3二进制搜索中的while循环中

时间:2016-11-23 20:11:10

标签: c cs50

我正在尝试使用while循环实现二进制搜索。当我正在寻找的int在阵列中时似乎有效;但是,当我正在搜索的int不存在时,程序似乎陷入循环,而不返回false。我一直在使用gdb,但我仍然无法弄清楚这个bug。正如你所看到的,我可能会添加一些额外的if语句等等,试图解决这个问题。

bool search(int value, int values[], int n) {
    sort(values, n);

    int begin = 0;
    int end = (n - 1);

    if (n < 1) {
        return false;
    }
    while (end > begin + 1) {
        int center = ((begin + end) / 2);
        if (values[0] == value) {
            return true;
        }
        if (begin == value) {
            return true;
        }
        if (end == value) {
            return true;
        }
        if (end == (begin + 1) || end == begin) {
            if (end == value || begin == value) {
                return true;
            } else {
                return false;
            }
        }
        if ((values[center]) == value) {
            return true;
        } else
        if ((values[center]) > value) {
            end = center;
        } else
        if ((values[center]) < value) {
            begin = center;
        } else {
            return false;
        }
    }
    // TODO: implement a searching algorithm
    return false;
}

3 个答案:

答案 0 :(得分:0)

你为什么要这样做?

if (values[0]==value)
    {
        return true;
    }
    if (begin == value)
    {
        return true;
    }
    if (end == value)
    {
        return true;
    }
    if (end == (begin+1) || end == begin)
    {
        if (end == value || begin == value)
        {
        return true;
        } 
        else
        {
        return false;
        }
    }

他们没有必要。你可以像下面这样做

while(end>beg+1 && values[center]!=value)
     {
     if ((values[center])>value)
        end = center-1;
    else if (values[center]<value)
        begin = center+1;
    center=(end+begin)/2;
     }
     if(values[center]==value)
           return true;
     else return false;
    }

我不明白你使用sort(values,n);的原因 如果它是C ++代码,则将其用作sort(values,values+n); 如果它是C代码,则根据您的阵列大小时间,使用任何算法对数组进行排序。 谢谢。

答案 1 :(得分:0)

你不必要地过度复杂这个简单的事情。 您可以删除代码中的所有额外内容并使用此

   `if ((values[center])==value)
    {
        return true;
    }
    else if ((values[center])>value)
    {
        end = center-1;
    }
    else if ((values[center])<value)
    {
        begin = center+1;
    }

`

答案 2 :(得分:0)

您的代码太复杂了。以下是一些提示:

  • 您应该使用包含左索引和右索引的范围,这在C中是惯用的,并且会导致更简单的算法。

  • 如果center = start + (end - start) / 2;center = (start + end) / 2;非常大,您应该计算start而不是end以避免潜在的整数溢出。

  • 数组大小应为size_t,可能大于int

  • 将值与范围中间元素的值进行比较:

    • 如果相等,则找到该值,返回true。
    • 如果更小,则缩小左侧部分的范围,排除中心。
    • 否则将范围缩小到右边部分,排除中心。
  • 如果范围为空,则找不到该值,返回false。

这是一个更简单的版本:

bool search(int value, int values[], size_t n) {
    // Assuming values is sorted before calling this function
    //sort(values, n);

    size_t begin = 0;
    size_t end = n;

    while (begin < end) {
        size_t center = begin + (end - begin) / 2;
        if (value == values[center]) {
            return true;
        }
        if (value < values[center]) {
            end = center;
        } else {
            begin = center + 1;
        }
    }
    return false;
}