簡體   English   中英

二分查找在 C 中不起作用

[英]binary search doesn't work in C

我有以下二分搜索算法:

int search_binary(int* tab,int size, int a)
{
    int lower=0,upper=size-1,middle=(lower + upper)/2;
    while(lower < upper)
    {
        if(tab[middle] == a)
            break;
        else if(tab[middle] < a)
        {
            upper = middle - 1;
            middle = (lower + upper)/2;
        } else {
            lower = middle + 1;
            middle = (lower + upper)/2;
        }

    }

    if(tab[middle] == a)
        return middle;
    else
        return -1;

}

如果我插入一個存在的數字,它要么返回 -1,要么返回錯誤的索引。

示例數據:

表:2 2 4 5 7 7 8 8 8 9

搜索次數:7

結果:指數為:4

表:1 2 3 4 6 6 6 7 8 9

搜索數量:4

結果:索引為:-1

else if(tab[middle] < a)
    {
        upper = middle - 1;
        middle = (lower + upper)/2;
    }

從這里看來,您希望數組按降序排列。 事實上,給它一個這樣排序的數組,它對我有用。

只需將if更改為:

if(tab[middle] > a)

讓它為按遞增順序排列的數組工作

你的循環功能略有變化 -

int search_binary(int* tab,int size, int a)
{
   int lower=0,upper=size-1,middle=(lower + upper)/2;
   while(lower < upper)
  {
    if(tab[middle] == a){               // if found 
        return middle;                  // return index 
      }
    else if(tab[middle] < a)            // if a is greater 
    {
        lower= middle ;          //lower is updated to middle,search in part above middle 
        middle = (lower + upper)/2;
    } else {
        upper = middle - 1;     //else upper is updated search in part lower than middle
        middle = (lower + upper)/2;
    }

  }
 return -1;
}

tab[middle]<a時,你的循環犯了什么錯誤,然后由於upper更新,它會在第0 to middle -1部分0 to middle -1搜索數字,而數字處於更高的索引。我已經用變量中的正確更改更新了你的代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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