整列済みの配列に要素を追加するという処理がたびたび必要になるんだけど、二分探索で範囲を更新する際にどっちを+1/-1する必要があるのがわからないとか終了条件を間違えて無限ループするとかで毎回調べてたのでメモしておく。
用途
ライブラリなどで用意されているいわゆるbsearch
関数では一致する要素がある場合にのみ結果が得られるが、挿入すべき位置を知りたいので一致する要素がない場合にも結果が欲しい。
コード
- テストもしたのでちゃんと動くはず…。
- codepenは実行結果のconsole出力を埋め込めないのね…。
境界条件
二分探索アルゴリズムを一般化 〜 めぐる式二分探索法のススメ 〜 - Qiita で紹介されていた、めぐる式二分探索法だと+1しなくていいから間違えづらいとか:
function bsearchInsertPosition(array, value, compare = (a, b) => a < b) { |
【めぐるのアルゴリズム講座】
— 因幡めぐる@競技プログラミング (@meguru_comp) February 9, 2016
二分探索(整数)の書き方
難しさ:4 pic.twitter.com/LGLbkS0D7l