关于二进制搜索算法的问题

时间:2016-12-17 12:24:52

标签: c algorithm int declaration binary-search

在搜索数组中不存在的元素时,我很难理解代码的行为。

  1. 我要查找的元素索引的结果始终为零,同时将其声明为int index;
  2. 我要查找的元素索引的结果是随机数,同时将其声明为size_t index; 在下面的代码中将变量索引声明为int index;size_t;之间有什么区别。
  3. 代码

    #include <stdio.h>
    #define SIZE 5
    int main(void)
    {
        int numbers[SIZE]={1,2,3,4,5};
        int search =0; // This variable define the required number i am searching for 
        int start = 0 ;
        int end = SIZE-1 ;
        size_t index;
        while (start <= end)
        {
            int middle = (start+end)/2;
            if  (search == numbers[middle])
            {
                index = middle;
            }
            if (search > numbers[middle])
            {
                start = middle+1 ;
            }
            else
            {
                end= middle-1 ;
            }
        }
        printf("The index of the element is %d",index);
    return 0;
    }
    

4 个答案:

答案 0 :(得分:3)

基本问题是index未初始化,并且当您找不到要搜索的内容时,它永远不会被分配。由于printf语句在这种情况下访问未初始化的变量,因此您的代码具有未定义的行为,即可能发生任何事情 - 包括打印各种数字。

  

我正在寻找的元素索引的结果总是为零,同时将其声明为int index;

那是&#34;只是运气&#34;

  

我正在寻找的元素索引的结果是随机数,同时将其声明为size_t索引;

这也是&#34;只是运气&#34;

答案 1 :(得分:1)

以下是一些可用于改进代码的操作项:

  1. 由于此数组是静态定义的,因此无需在SIZE内包含[]定义。将其声明为此int numbers[]={1,2,3,4,5};而不是此int numbers[SIZE]={1,2,3,4,5};。让编译器为你做数学。
  2. index初始化为某个值(即index = 0;)。这是问题的主要原因,它正在为程序引入未定义的行为。
  3. size_t index的类型更改为int index计划中声明的每个变量都是int,并且该程序将index视为int 。所以它可能是int以避免混淆。
  4. 将其设为else if子句,而不仅仅是if

    else if (search > numbers[middle])
    {
        start = middle+1 ;
    }   
    
  5. 添加另一个案例,以便在数据集中缺少要搜索的值时使程序正常失败。例如,printf("Data not found: %d", search);

  6. 算法仍然不是100%并且有一些缺陷但是我会把这个留给你弄清楚。我希望这些信息有所帮助!

    最诚挚的问候!

答案 2 :(得分:1)

问题在于,index的值未初始化。

将变量初始化为0并不能解决您的问题。 因为您使用index来返回数组元素的位置。

通过初始化index = 0将为数组中不存在的元素以及数组的第一个元素提供相同的结果。

更好的方法是初始化为size_t index = -1;

因此,数组中不存在的元素的结果将为b -1。

还检查printf语句中使用的访问说明符,对于size_t数据类型。它可以是,

printf("The index of the element is %ld",index);

答案 3 :(得分:0)

您没有为size_t使用正确的说明符,它不是%d。

尝试使用%zd或%ld,它可以正常工作。

此外,在while循环之后添加它,以便当数组中不存在该元素时,它不会显示索引的奇怪值。

if(start>end) {
   printf("That number is not present in the array");
   return 0;
}

并在条件printf("The index of the element is %d",index);下移动if (search == numbers[middle])行。所以你没有得到这个号码,这个数字不存在&#34;即使它存在于阵列中。 有关代码的更正版本,请参阅https://code.hackerearth.com/80043dg?key=7b325b26aec0f5425b76cc3efbdc93cf