【Java】再帰処理による二分探索プログラムの書き方と解説
以下は、Javaで再帰呼び出しを用いて二分探索(バイナリサーチ)を実装したサンプルプログラムです。
サンプルコード
public class Demo{
int rec_bin_search(int my_arr[], int left, int right, int x){
if (right >= left){
int mid = left + (right - left) / 2;
if (my_arr[mid] == x)
return mid;
if (my_arr[mid] > x)
return rec_bin_search(my_arr, left, mid - 1, x);
return rec_bin_search(my_arr, mid + 1, right, x);
}
return -1;
}
public static void main(String args[]){
Demo my_object = new Demo();
int my_arr[] = { 32, 45, 56, 78, 90, 99, 104};
int len = my_arr.length;
int x = 104;
int result = my_object.rec_bin_search(my_arr, 0, len - 1, x);
if (result == -1)
System.out.println("The element is not present in the array");
else
System.out.println("The element has been found at index " + result);
}
}実行結果
The element has been found at index 6
コードの解説
クラス「Demo」の中に、二分探索を行うメソッド rec_bin_search を定義しています。このメソッドは、対象となる配列・探索範囲の左端(left)・右端(right)・そして探したい値(x)を引数として受け取ります。
まず探索範囲の中央インデックス mid を計算し、その位置の値と目的の値を比較します。一致していればそのインデックスを返し、中央の値が大きければ左半分を、小さければ右半分を対象として自分自身を再帰的に呼び出し、探索範囲を半分ずつ絞り込みながら処理を続けます。最終的に要素が見つからなければ -1 を返します。
main メソッドでは Demo クラスのインスタンスを生成し、配列に値を設定したうえで二分探索メソッドを呼び出しています。要素が見つかった場合はそのインデックスが表示され、見つからなかった場合は「要素が配列内に存在しない」旨のメッセージが出力されます。
注意点:二分探索にはソート済み配列が必要
二分探索は「配列が昇順にソートされている」ことを前提としたアルゴリズムです。ソートされていない配列に対しては正しく動作しないため、事前に Arrays.sort() などで並べ替えておく必要があります。
また、二分探索の時間計算量は O(log n) であり、先頭から順に調べる線形探索の O(n) と比べて、大規模なデータセットでも高速に検索できる点が大きなメリットです。
-
Javaで実装するカクテルソート(双方向バブルソート)のプログラム
カクテルソート(Cocktail Sort)は、バブルソートを改良した整列アルゴリズムの一つで、「双方向バブルソート」や「シェーカーソート」とも呼ばれます。通常のバブルソートが配列を一方向にのみ走査するのに対し、カクテルソートは前方向と後方向を交互に走査する点が最大の特徴です。まず前方向のパスでは、隣り合う要素を比較しながら大きい値を配列の末尾側へ移動させます。続く後方向のパスでは、逆に小さい値を配列の先頭側へ移動させます。この往復操作を、交換が一度も発生しなくなるまで繰り返すことで、配列全体が昇順に整列されます。この手法により、配列の終盤に位置する小さな要素でも、1回の後方向パスで先頭付近ま
-
Pythonで二分探索(バイナリサーチ)を実装する方法|再帰版・反復版のコード例で解説
はじめに本記事では、ソート済みリストから特定の要素を効率的に探し出す「二分探索(バイナリサーチ)」について、その基本的な考え方とPythonでの実装方法を解説します。問題定義ソートされたリストが与えられます。このリストの中から、指定した要素を二分探索のアルゴリズムを使って見つけ出すことが課題です。アルゴリズムの流れ探索対象の値 x を、リスト中央の要素と比較します。x が中央の要素と一致すれば、そのインデックス(mid)を返します。x が中央の要素より大きい場合、x は中央より右側の半分にしか存在し得ないため、右半分を再帰的に探索します。x が中央の要素より小さい場合は、左半分を再帰的に探索し