0

这是一个具有递归二进制搜索算法的 C 程序,但是当我运行它时,调试器说二进制搜索函数中存在访问分段错误。为什么会这样,我该如何解决?

下面是递归二分查找函数:

int binSearch(int val, int numbers[], int low, int high)                 
{
     int mid;

     mid=(low+high)/2;
     if(val==numbers[mid])
     {  
                return(mid);          
     }   
     else if(val<numbers[mid])
     {
                return(binSearch(val, numbers, low, mid-1));               
     }            
     else if(val>numbers[mid])
     { 
                return(binSearch(val, numbers, mid+1, high));  
     }    
     else if(low==high)
     {
                return(-1);    
     }
}

谢谢 :)

4

4 回答 4

5

您必须low == high在之前检查val < ...val > ...因为否则high可能会变得小于low,因此您的下一次递归可能会计算出无效mid

于 2013-07-24T09:44:30.410 回答
2

您的边缘情况已关闭:具体而言,当您的low和索引通过时,您会在到达测试high之前继续递归调用。low == high重新排列测试:

int binSearch(int val, int numbers[], int low, int high) {
    int mid = (low + high) / 2;

    if (val == numbers[mid]) return mid;

    if (val < numbers[mid]) {
        if (mid > low) return binSearch(val, numbers, low, mid-1);
    } else if (val > numbers[mid]) {
        if (mid < high) return binSearch(val, numbers, mid+1, high);
    }
    return -1;
}
于 2013-07-24T09:49:38.390 回答
0

尝试这个:

修复了代码中的 if 构造

int binSearch(int val, int numbers[], int low, int high)                 
{
     int mid;

     mid=(low+high)/2;

     if(low<=high)
     {
         if(val==numbers[mid])
           return mid;          

         else if(val<numbers[mid])
           return binSearch(val, numbers, low, mid-1);

        else 
          return binSearch(val, numbers, mid+1, high);  
     }
     else
           return -1;    

}
于 2013-07-24T09:48:10.707 回答
0

low<high不保证。如果不是这种情况,您将在数组绑定之外进行搜索。

为此添加一个健全性检查。

if (low < high)
     return -1;

编辑:正如其他指出的那样,您还可以在开始时检查 low == high 但这并不能确保函数的第一次调用具有合理的价值。

于 2013-07-24T09:48:40.463 回答