バブルソート実装・詳しい計算量解説

2024/06/14
Cover Image for バブルソート実装・詳しい計算量解説

バブルソート(Bubble Sort)

バブルは泡の意味で、ソートしているデータが泡のように浮かび上がっていく様子に由来しています。

このサイトでのバブルソートの定義は以下の通りです。1

計算量 O(N2)O(N^2)

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

バブルソートはデータ配列のはじめから終わりまで隣接する要素を比較して、順番が逆であれば交換するという操作を繰り返し、終わりまで繰り返したら一番最後のデータをソート済みにし、再度繰り返すアルゴリズムです。

バブルソートは一番簡単と言われるソートアルゴリズムです。

詳しく手順を説明すると以下の通りです。

  1. データ配列のソートされていない部分のはじめから終わりまで隣接する要素を比較する
  2. 隣接する要素が逆順であれば交換する
  3. 終わりまで繰り返したら一番最後のデータがソート済みになる
  4. 未ソートの部分がなくなるまで 1~3 を繰り返す

bubble_sort

以下に C 言語での実装例を示します。

#include <stdio.h>
 
void bubbleSort(int *data, int n)
{
	int i, j;
	for (i = 1; i < n; i++)
	{
		for (j = 0; j < i; j++)
		{
			if (data[j] < data[j+1])
			{
				int tmp = data[j];
				data[j] = data[j+1];
				data[j+1] = tmp;
			}
		}
	}
}

バブルソートの計算量

今回はバブルソートのデータ比較回数について着目し、計算量の議論を行います。

はじめにバブルソートは、はじめから終わりまで隣接したデータを比較するので、データ数NNに対して、N1N-1回の比較を行うことになります。

次に、N1N-1回の比較を行った後、最大値が一番最後に来るので、次のN2N-2回の比較を行います。

このように、N1N-1回、N2N-2回、N3N-3回、\cdots11回の比較を行うことになります。

これを数式で表すと、以下のようになります。

(N1)+(N2)+(N3)+...+1(N-1) + (N-2) + (N-3) + ... + 1

この式は等差数列としてみなすことができます。

等差数列の和の公式を用いると、以下のようになります。

(N1)+(N2)+(N3)+...+1=N(N1)2(N-1) + (N-2) + (N-3) + ... + 1 = \frac{N(N-1)}{2}

この式は NN について 2 次の式になっているので、O(N2)O(N^2)となります。

したがって、バブルソートの計算量はO(N2)O(N^2)となります。

Footnotes

  1. それぞれのソートアルゴリズムの定義は、他のサイトや書籍等での定義と少々異なる場合があります。