バブルソート
バブルソートは単純なソートアルゴリズムです。これは、隣接する要素を繰り返し比較し、順番が間違っている場合はそれらを入れ替えることで動作します。比較を繰り返すことで、最小/最大の要素が配列の最後に向かってバブルアップしていくので、このアルゴリズムはバブルソートと名付けられました。非効率的ではありますが、ソートアルゴリズムの基礎となっています。
バブルソートアルゴリズム
n 個の要素を含むソートされていない配列 A[]
があるとしましょう。
-
最初の 2つの要素(
A[0]
とA[1]
)のペアから始めて、その値を比較し、順番が違っていれば入れ替えます。次のペア(A[1]
&A[2]
)についても同様の処理を行い、残りの配列についても同様の処理を行う. 最小/最大の要素は、このステップの後の最後の位置にあります。 -
上記のステップを
(n-2)
回繰り返して、残りの繰り返しを行う。最後の要素は既にソートされているので、配列のサイズを 1つずつ小さくします。この繰り返しの中で最も小さい/最も大きい要素が右端に移動します。
上記アルゴリズムのステップ 1 はパスとも呼ばれます。サイズ n の配列をソートするには、n-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 <iostream>
using namespace std;
void bubble_sort(int arr[], int n) {
for (int i = 0; i < n - 1; i++) {
for (int j = 0; j < n - i - 1; j++) {
if (arr[j] > arr[j + 1]) {
swap(arr[j], arr[j + 1]);
}
}
}
}
int main() {
int n = 5;
int arr[5] = {5, 3, 4, 2, 1};
cout << "Input array: ";
for (int i = 0; i < n; i++) {
cout << arr[i] << " ";
}
cout << "\n";
bubble_sort(arr, n); // Sort elements in ascending order
cout << "Output array: ";
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