我的二进制搜索确实有问题,这应该像lower_bound一样。这让我在第五轮中出现了段错误。任何人都可以看到问题吗?感谢
int BinarySearch ( const char * a, int firstindex , int lastindex){
if (m_len == 0) return 0; //number of items in searched array
if ( firstindex == lastindex ) return lastindex;
int tmp = lastindex - firstindex;
int pos = tmp/2;
if ( tmp % 2 != 0 ) ++pos;
if (strcmp(a,Arr[pos]) < 0) return BinarySearch(a,firstindex,pos-1);
if (strcmp(a,name) > 0) return BinarySearch(a,pos+1,lastindex);
return pos;
}
答案 0 :(得分:1)
int tmp = lastindex - firstindex;
应该是:
int tmp = lastindex + firstindex;
那是因为你正在寻找索引x和y的中间,即(x + y)/ 2。
您的代码行为应该是不可预测的,可能会循环并导致分段错误。
答案 1 :(得分:1)
x和y之间的中点是x +(y - x)/ 2,所以你想要
int pos = firstIndex + tmp/2;
使用稍微复杂的表达式而不是明显的(x + y)/ 2表示消除了非常常见的溢出错误。