C++で実装する再帰バブルソート:プログラムと仕組みをわかりやすく解説
バブルソートは、隣接する2つの要素を比較し、順序が正しくない場合に入れ替え(スワップ)を行うことで配列を整列させる基本的なソートアルゴリズムです。この記事で紹介するのはその再帰版で、自分自身を呼び出す「再帰関数」を使ってソートを実現します。
入力:5 3 4 2 1
出力:1 2 3 4 5
アルゴリズムの流れ
再帰的なバブルソートでは、以下の手順で処理が進みます。
- 1回のパスで配列を先頭から走査し、隣接する要素を比較します。
- 前の要素が次の要素より大きければ、両者を入れ替えます。
- パスが終わると、最も大きい要素が配列の末尾に確定します。
- その後、関数が自分自身を呼び出し、未整列の部分(要素数を1減らした範囲)に対して同じ処理を繰り返します。
- 残りの要素数が1以下になった時点で再帰を終了し、配列全体が昇順に整列されます。
C++での実装例
#include <iostream>
using namespace std;
void bubbleSort(int arr[], int n) {
for (int i = 0; i < n - 1; i++) {
if (arr[i] > arr[i + 1]) {
int temp = arr[i];
arr[i] = arr[i + 1];
arr[i + 1] = temp;
}
}
if (n - 1 > 1) {
bubbleSort(arr, n - 1);
}
}
int main() {
int arr[] = { 5, 3, 4, 2, 1 };
int n = 5;
bubbleSort(arr, n);
for (int i = 0; i < n; i++) {
cout << arr[i] << "\t";
}
return 0;
}
コードのポイント
- 比較と交換:forループ内で隣接する要素 arr[i] と arr[i + 1] を比較し、順序が逆であれば一時変数 temp を使って入れ替えます。
- 再帰の終了条件:if (n - 1 > 1) により、未整列部分が2要素以上ある間だけ自分自身を再度呼び出します。この条件がないと無限再帰に陥るため非常に重要です。
- 計算量:平均・最悪ケースともに時間計算量は O(n²) です。また再帰呼び出しの深さも O(n) になるため、大きな配列を扱う際はスタックオーバーフローに注意が必要です。
まとめ
再帰版のバブルソートは、反復処理(ループ)を再帰呼び出しに置き換えたものであり、動作原理自体は通常のバブルソートとまったく同じです。アルゴリズムや再帰の理解を深める学習目的には最適ですが、実務の開発では std::sort のような効率的な標準ライブラリを利用するのが一般的です。
-
C++でシェーカーソートを実装する方法|アルゴリズムとサンプルコード解説
シェーカーソートとは シェーカーソート(Shaker Sort)は、与えられたデータを昇順に並べ替えるためのソートアルゴリズムの一つです。バブルソートとよく似ていますが、決定的に異なるのは配列を双方向(往復)に走査して整列を進める点です。「カクテルソート」「双方向バブルソート」と呼ばれることもあります。このアルゴリズムの最悪計算量は O(n²) です。 アルゴリズムの手順 開始 ShakerSort() 関数は、引数としてデータ配列 arr と要素数 n を受け取る。 // ネストした for ループを使ってソートを実装する。 外側のループは i を 0 から n-1 まで回し、
-
Javaで実装する再帰的バブルソートのプログラムと仕組みをわかりやすく解説
バブルソートは、隣り合う要素を比較して並べ替える最も基本的なソートアルゴリズムの一つです。通常はfor文などのループで実装されますが、再帰呼び出しを使って実現することもできます。ここでは、Javaで再帰的にバブルソートを実装する方法を、サンプルコードとともに詳しく解説します。 再帰的バブルソートのサンプルコード 以下が、再帰処理を用いたバブルソートのJavaプログラムです。 import java.util.Arrays; public class Demo{ static void bubble_sort(int my_arr[], int len_arr){