【问题标题】:Binary search function in CC中的二进制搜索功能
【发布时间】:2013-12-12 07:49:37
【问题描述】:

程序“随机”选择一组 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;
}

【问题讨论】:

  • 二分搜索中for 循环的意义何在?
  • 我认为有必要先排序才能搜索数字。
  • 不,真的不是……

标签: c arrays search binary


【解决方案1】:

二进制搜索是关于排序的数组/列表/等等......你的程序感觉随机数。

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

【讨论】:

    【解决方案2】:

    在你的二分搜索函数中,你有这个循环......

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

    在其中,您可以多次更改beginningending 的值,而不会更改middle。这意味着 beginningending 会根据 middle 的单个值进行多次调整,这反过来意味着它可以“取消”实际包含您正在搜索的数字的数组范围。

    此外,正如 MeNa 在他/她的回答中指出的那样,二分搜索旨在搜索有序数据集。对于随机顺序的数组是没用的。

    【讨论】:

      【解决方案3】:

      如果这不是家庭作业,您可以尝试使用bsearch(如果有的话)。 (这是一个 POSIX 函数。)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-11-24
        • 1970-01-01
        • 2015-01-12
        • 1970-01-01
        • 1970-01-01
        • 2017-03-26
        • 1970-01-01
        • 2021-09-18
        相关资源
        最近更新 更多