二分搜索在C中不起作用

时间:2015-10-20 13:09:27

标签: c binary-search

我有以下二进制搜索算法:

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,存在或返回错误的索引。

exampledata:

表: 2 2 4 五 7 7 8 8 8 9

搜索号码: 7

结果: 指数是:4

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

搜索号码: 4

结果: 索引是:-1

2 个答案:

答案 0 :(得分:3)

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

从这里开始,您希望数组按递减顺序排序。事实上,给它一个这样排序的数组,它对我有用。

只需将if更改为:

即可
if(tab[middle] > a)

使其适用于按递增顺序排列的数组

答案 1 :(得分:0)

你的功能循环略有变化 -

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的更新而它会在部分{{...}}中搜索数字时,你的循环出现了什么错误,而数字是更高的索引。我已经更新了你的代码正确改变vairables。