C中的二进制搜索功能

时间:2013-11-26 22:35:02

标签: c arrays search binary

程序“随机”选择一组8个数字,然后用户必须尽可能多地猜测这些数字。但即使我输入这个随机数组中的数字,binary_search函数也找不到“随机”数字数组中的确切数字。我似乎无法在我的binary_search函数中找到错误(至少我怀疑那就是问题所在)。我已经尝试过大数字大小的程序。有人可以帮我吗?

#define SIZE 3
#define min  1
#define max  36

int random();
bool binary_search(int value, int values[], int n);

int main(void)
{
    int numbers[SIZE];
    for(int i = 0; i < SIZE; i++)
        numbers[i] = random();
    int score = 0;
    int n[SIZE];
    int number_user;


    for(int i = 0; i < SIZE; i++)
    {   
        //Type in a number
        do
        {
            printf("Search number no.%d:\n> ", i + 1);
            n[i] = GetInt();

            //Wrong input number
            if(n[i] < min || n[i] > max)
            {
                printf("\nNumber should be between %d - %d!!!\n\n", min , max);
            }
        }
        while(n[i] < min || n[i] > max);

        //THE PROBLEMATIC STUFF - START
        number_user = n[i];
        if (binary_search(number_user, numbers, SIZE))
        {
            printf("FOUND!!!\n");
            score += 1;
        }
        else 
        {
            printf("NOT IN THE LIST\n");
        }
        //PROBLEMATIC STUFF - FINISH
    }

    //scoring
    printf("\n\n*******SCORE*******\n");
        //print your numbers
        for(int i = 0; i < SIZE; i++)
        {
            printf(" %d", n[i]);
            if(i != SIZE - 1)
                printf(",");
            if(i == SIZE - 1)
                printf(".\n");
        }

        //print right numbers
        printf("\nRight numbers are:");
        for(int i = 0; i < SIZE; i++)
        {
            printf(" %d", numbers[i]);
            if(i != SIZE - 1)
                printf(",");
            if(i == SIZE - 1)
                printf(".\n");
        }

    int result = score / SIZE * 100;
    printf("Your score is: %d / %d , %d %%\n", score, SIZE, result);


    return 0;    
}
 //PROBLEM START
bool binary_search(int value, int values[], int n)
{
    int beginning = 0;
    int ending = n - 1;

    int middle;

    while (ending >= beginning) 
    {    
        middle = (beginning + ending) / 2; 
        for(int i = 0; i < SIZE; i++)
        {
            //look at middle of list if (binary_search(n, numbers, SIZE))
            if(values[middle] == value)
                //if number found, return true 
                return true;

            //else if middle higher, search left 
            else if(values[middle] > value)
                ending = middle - 1;

            //else if middle lower, search right 
            else if(values[middle] < value)
                beginning = middle + 1;
        } 
    }
    return false; 
}
//PROBLEM FINISH

int random()
{
    int r = rand() % ((max - min + 1) + min);

    return r;
}

3 个答案:

答案 0 :(得分:5)

二进制搜索是关于排序的数组/列表/等等......你的程序会感觉到randomal数字。

https://en.wikipedia.org/wiki/Binary_search_algorithm(第二行)。

答案 1 :(得分:2)

在你的二元搜索功能中你有这个循环......

for(int i = 0; i < SIZE; i++)
{
    ...
} 

在其中,您多次更改beginningending值而不更改middle。这意味着beginningending会根据middle的单个值进行多次调整,这反过来意味着它可以“取消”实际拥有该数字的数组的范围“重新寻找。

此外,正如 MeNa 在他/她的回答中指出的那样,二进制搜索用于搜索有序数据集。它对于随机顺序的数组来说是无用的。

答案 2 :(得分:1)

如果这不是作业,你可以尝试使用bsearch。 (这是POSIX功能。)