PSet3 - CS50 - 二进制搜索实现

时间:2014-04-23 05:34:02

标签: c cs50

这是来自edX.org的CS50课程的PSET 3。

我一直在努力解决这个问题很长一段时间;特别是,我无法使binarySearch函数工作。我一直遇到分段错误,我无法弄清楚如何处理它。我花了很多时间思考这个问题,而我却没有看到它。

这是我的代码。有人可以在概念上指出我在这里歪斜的地方吗?谢谢。

#include <stdio.h>
#include <cs50.h>

bool binarySearch(int value, int values[], int min, int max)
{
    bool answer = false; 

    if (max < min)
    {
        answer = false;
    }

    else if (values[max] == value)
    {
        answer = true;
    }

    else if (values[min] == value)
    {
        answer = true;
    }

    else
    {
        int midPoint = (max + min) / 2;

        if (values[midPoint] == value)
        {
            answer = true; 
        }

        else if (values[midPoint] > value)
        {
            answer = binarySearch(value, values, min, midPoint);
        }

        else
        {
            answer = binarySearch(value, values, midPoint, max);
        }
     }

    return answer;
}

int main (int argc, char *argv[])
{
    int value = 34;

    int values[] = {11,22,33,44,55,66,77,88,99,1010};

    int max = sizeof(values) / sizeof(int);

    if (binarySearch(value, values, 0, max - 1))
    {
        printf("Found needle!\n");
    }

    else
    {
        printf("Did not find needle\n");
    }
}

当我搜索的值不在数组中时,我一直遇到分段错误。

2 个答案:

答案 0 :(得分:3)

我认为您应该将代码更改为:

 else
    {   
        int midPoint = (max + min) / 2;

        if (values[midPoint] == value)
        {
            answer = true; 
        }

        else if (values[midPoint] > value)
        {
            answer = binarySearch(value, values, min, midPoint-1); // not midPoint
        }

        else
        {
            answer = binarySearch(value, values, midPoint+1, max); //not midPoint
        }
     } 

答案 1 :(得分:2)

问题出在这里

if (max < min)

最终,max将等于min,但代码中的任何内容都不会使max小于min。因此,如果指定的值不在数组中,函数将永远递归。