[英]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.