再帰的バブルソート
バブルソートは単純なソートアルゴリズムです。これは、隣接する要素を繰り返し比較し、順番が間違っている場合はそれらを入れ替えることで動作します。比較を繰り返すことで、最小/最大の要素が配列の最後に向かってバブルアップするので、このアルゴリズムはバブルソートと名付けられています。非効率的ではありますが、ソートアルゴリズムの基礎となっています。
バブルソート再帰的アルゴリズム
n 個の要素を含むソートされていない配列 A[]
があるとしましょう。
-
配列
A
のサイズを1
とすると、その配列はすでにソートされていることになります。ということで、リターンします。 -
そうでなければ、与えられた部分配列に対して反復処理バブルソートを 1 パス実行します。最後の要素を正しい位置に配置します。
-
再帰呼び出しを使用して、サイズを 1つ小さくした部分配列で上記のステップを再度実行します。
バブルソートの再帰アルゴリズムの例
配列があるとしましょう。(5,3,4,2,1)
. これをバブルソートアルゴリズムを用いてソートします。
- 最初のパス
(5 3 4 2 1) | → | (3 5 4 2 1) | (3 < 5 スワップ) |
(3 5 4 2 1) | → | (3 4 5 2 1) | (4 < 5 スワップ) |
(3 4 5 2 1) | → | (3 4 2 5 1) | (2 < 5 スワップ) |
(3 4 2 5 1) | → | (3 4 2 1 5) | (1 < 5 スワップ) |
- 2 回目のパス
(3 4 2 1 5) | → | (3 4 2 1 5) | |
(3 4 2 1 5) | → | (3 2 4 1 5) | (2 < 4 スワップ) |
(3 2 4 1 5) | → | (3 2 1 4 5) | (1 < 4 スワップ) |
- 3 回目のパス
(3 2 1 4 5) | → | (2 3 1 4 5) | (2 < 3 スワップ) |
(2 3 1 4 5) | → | (2 1 3 4 5) | (1 < 3 スワップ) |
- 4 回目のパス
(2 1 3 4 5) | → | (1 2 3 4 5) | (1 < 2 スワップ) |
4 回目のパスの後、ソートされた配列が得られます - (1 2 3 4 5)
。
バブルソート再帰的アルゴリズムの実装
#include <bits/stdc++.h>
using namespace std;
void bubbleSort(int arr[], int n) {
if (n == 1) return;
for (int i = 0; i < n - 1; i++) {
if (arr[i] > arr[i + 1]) {
swap(arr[i], arr[i + 1]);
}
}
bubbleSort(arr, n - 1);
}
int main() {
int n = 8;
int arr[8] = {9, 8, 3, 7, 5, 6, 4, 1};
cout << "Input arr: ";
for (int i = 0; i < n; i++) {
cout << arr[i] << " ";
}
cout << "\n";
bubbleSort(arr, n); // Sort elements in ascending order
cout << "Output arr: ";
for (int i = 0; i < n; i++) {
cout << arr[i] << " ";
}
cout << "\n";
}
バブルソートアルゴリズムの複雑さ
時間複雑度
- 平均のケース
平均的には、バブルソートの ith
パスで n-i
比較が行われます。したがって、n 個のパスがある場合、平均時間の複雑さは次のように与えられます。
(n-1) + (n-2) + (n-3) ..... + 1 = n*(n-1)/2
したがって、時間の複雑さは O(n2)のオーダーになります。
- 最悪のケース
最悪のケースは、配列が逆ソートされたときに発生し、最大数の比較とスワップを実行しなければなりません。
最悪の場合の時間的複雑さは、O(n2)です。
- 最良のケース
最良のケースは、配列が既にソートされていて、N 回の比較だけが必要な場合です。
最良の時間的複雑さは O(n)
です。
空間計算量
このアルゴリズムの空間複雑度はスタック内に再帰的な呼び出しが格納されているため、O(n)
です。
Harshit Jindal has done his Bachelors in Computer Science Engineering(2021) from DTU. He has always been a problem solver and now turned that into his profession. Currently working at M365 Cloud Security team(Torus) on Cloud Security Services and Datacenter Buildout Automation.
LinkedIn