二分探索は、再帰的、反復的、条件付きなど、さまざまな方法で実装できます。Bentley の本「Programming pearls : Writing correct programs」から引用しました。これは反復実装であり、バグが含まれています。
public class BinSearch
{
static int search( int [] A, int K ) {
int l = 0;
int u = A. length -1;
int m;
while ( l <= u ) {
m = (l+u) /2;
if (A[m] < K){
l = m + 1;
} else if (A[m] == K){
return m;
} else {
u = m-1;
}
}
return -1;
}
}
行 m = (l+u) /2; にバグが見つかりました。オーバーフローにつながる可能性があります。このバイナリ検索でこのオーバーフローを回避するにはどうすればよいでしょうか?