「二分探索」の版間の差分

削除された内容 追加された内容
→‎例: ノートでYokoyama-Tetsuyaさんが指摘された部分を修正
中央値の計算について説明を追加。よくある間違いについてimax等が何を指すのかわかるように。
36行目:
|}
 
まず、配列の中央の位置を求めると、1 + (10 - 1) / 2 = 5 
:<small>除算の端数は切捨、切上のどちらでもいいが、ここは切捨とする。以下同じ。</small>
:<small>中央位置の計算は、手計算では (1 + 10) / 2 でもよいが、プログラム上では 1 + (10 - 1) / 2 すなわち 最小値 + (最大値 - 最小値) / 2 とした方が安全である。[[#実装上の間違い]]を参照。</small>
位置5のデータは12なので「'''×'''」、位置1~4まではデータを調べなくても「×」とわかる。目的のデータは位置6~10にあるかもしれない。
 
201 ⟶ 202行目:
| isbn = 0-13-768995-0}}</ref>。
 
くある間違いの一つは、上記のC言語のコードで imin + (imax - imin) / 2 を (imax + imin) / 2 としてしまう事である。これでは、imax + imin が int の限界を超えてオーバーフローしてしまう可能性がある。Java の標準ライブラリの Arrays.binarySearch() では JDK 1.2 (1998年) から間違えており、Java 6 (2006年) で修正された<ref>[http://bugs.java.com/bugdatabase/view_bug.do?bug_id=5045582 Bug ID: JDK-5045582 (coll) binarySearch() fails for size larger than 1<<30]</ref>。
 
==関連項目==