バブルソート

Harshit Jindal 2023年10月12日
  1. バブルソートアルゴリズム
  2. バブルソートアルゴリズムの例
  3. バブルソートアルゴリズムの実装
  4. バブルソートアルゴリズムの複雑さ
バブルソート

バブルソートは単純なソートアルゴリズムです。これは、隣接する要素を繰り返し比較し、順番が間違っている場合はそれらを入れ替えることで動作します。比較を繰り返すことで、最小/最大の要素が配列の最後に向かってバブルアップしていくので、このアルゴリズムはバブルソートと名付けられました。非効率的ではありますが、ソートアルゴリズムの基礎となっています。

バブルソートアルゴリズム

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
Harshit Jindal avatar Harshit Jindal avatar

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

関連記事 - Sort Algorithm