[英]Issue about Binary search algorithm in c
我在寻找数组中不存在的元素时低估了代码的行为感到困惑。
int index;
始终为零int index;
。 size_t index;
将变量索引声明为int 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;
}
基本问题是index
没有初始化,当您找不到要搜索的内容时就永远不会分配index
。 由于在这种情况下, printf
语句访问未初始化的变量,因此您的代码具有未定义的行为,即可能发生任何事情-包括打印各种数字。
我正在寻找的元素索引的结果在声明为int索引时始终为零;
那是“靠运气”
我正在寻找的元素索引的结果是随机数,同时将其声明为size_t索引;
那也是“靠运气”
您可以采取以下几项措施来改进代码:
[]
包含SIZE
定义。 这样声明int numbers[]={1,2,3,4,5};
而不是此int numbers[SIZE]={1,2,3,4,5};
。 让编译器为您完成数学运算。 index
初始化为某个值(即index = 0;
)。 这是导致该问题的主要原因,并且正在向程序引入未定义的行为。 size_t index
的类型更改为int index
,在程序中声明的每个变量都是int
,并且程序将index
视为int
。 因此,避免混淆也可能是一个int
。 使它成为else if
子句,而不仅仅是if
:
else if (search > numbers[middle]) { start = middle+1 ; }
添加另一种情况,以便在数据集中缺少要搜索的值时使程序正常运行。 例如, printf("Data not found: %d", search);
该算法仍然不是100%并有一些缺陷,但我将由您自己确定。 希望此信息对您有所帮助!
最好的祝福!
问题在于, index
的值未初始化。
将变量初始化为0不能解决您的问题。 因为您使用index
来返回数组元素的位置。
通过初始化index = 0
将为数组中不存在的元素以及数组的第一个元素提供相同的结果。
更好的方法是初始化为size_t index = -1;
这样,数组中不存在的元素的结果将为b -1。
还要检查printf语句中使用的访问说明符,以获取size_t数据类型。 有可能 ,
printf("The index of the element is %ld",index);
您没有为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])
。 这样即使数组中存在该数字,您也不会得到“此数字不存在”的信息。 有关代码的更正版本,请参见https://code.hackerearth.com/80043dg?key=7b325b26aec0f5425b76cc3efbdc93cf
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.