簡體   English   中英

關於C語言中的二進制搜索算法的問題

[英]Issue about Binary search algorithm in c

在尋找數組中不存在的元素時低估了代碼的行為感到困惑。

  1. 我正在尋找的元素索引的結果在聲明為int index;始終為零int index;
  2. 我正在尋找的元素索引的結果是隨機數,同時將其聲明為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索引;

那也是“靠運氣”

您可以采取以下幾項措施來改進代碼:

  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%並有一些缺陷,但我將由您自己確定。 希望此信息對您有所幫助!

最好的祝福!

問題在於, 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM