【问题标题】:Issue about Binary search algorithm in c关于c中的二分搜索算法的问题
【发布时间】:2016-12-17 22:15:47
【问题描述】:

在搜索数组中不存在的元素时,我对理解代码的行为感到困惑。

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

代码

#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;
}

【问题讨论】:

  • %d 不是打印size_t 的正确格式说明符。
  • index = middle; --> index = middle; break; 还有size_t index; 未初始化。 --> size_t index = SIZE;SIZE 表示“未找到”)
  • size_t 的正确说明符是什么?@Hurkyl
  • 对于符合 C 标准的实现,请使用 zu。在 Windows 上使用lu
  • 当没有找到数据时 index 没有设置任何值,因此 intsize_t 都被初始化(这是未定义的行为)。初始化时尝试设置默认值index

标签: c algorithm int declaration binary-search


【解决方案1】:

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

我要查找的元素索引的结果在声明为int索引时始终为零;

那是“碰巧”

我要查找的元素索引的结果是随机数,同时声明为size_t索引;

那也是“碰巧”

【讨论】:

    【解决方案2】:

    您可以采取以下一些措施来改进您的代码:

    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);

    算法仍然不是 100% 并且有一些缺陷,但我会留给你来解决这个问题。我希望这些信息对您有所帮助!

    最好的问候!

    【讨论】:

      【解决方案3】:

      问题是,index的值没有初始化。

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

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

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

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

      还要检查 printf 语句中使用的访问说明符,以获取 size_t 数据类型。可以的,

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

      【讨论】:

        【解决方案4】:

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

        尝试使用 %zd 或 %ld 就可以了。

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

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

        并在条件if (search == numbers[middle]) 下移动printf("The index of the element is %d",index); 行。这样即使数组中存在“此数字不存在”,您也不会得到。 有关您的代码的更正版本,请参阅https://code.hackerearth.com/80043dg?key=7b325b26aec0f5425b76cc3efbdc93cf

        【讨论】:

        • 我更改了说明符,但行为相同@sanjay-sopho
        • 我不是在问如何以我知道的正确方式显示结果,你的代码需要修改@Sanjay-sopho
        • @Elhaw 请告诉我我的代码需要修改的地方。我想我的代码给出了正确的预期输出,因此它是正确的。
        • 您的条件确实保证了代码的正确输出,因为始终输出该数字不存在于数组中
        猜你喜欢
        • 2011-05-30
        • 2017-07-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-01-22
        • 2019-04-10
        相关资源
        最近更新 更多