アルゴ道場
動かして学ぶ 基本情報アルゴリズム
ホーム整列バブルソートFE頻出交換法

バブルソート Bubble Sort

隣接する2つの要素を比較し、大小が逆であれば交換します。これを配列の端から繰り返すと、最も大きい値が「泡(バブル)」のように端へ移動して確定します。

1回の外側ループ(パス)が終わるごとに、未確定範囲の最大値が右端に確定します。下のコードを1ステップずつ実行し、黄色(比較中)と赤色(交換)のセルがどう動くか確かめましょう。

📖 記号の読み方(はじめての人はここを確認)
代入(右の値を左の箱に入れる)。例: 合計 ← 0
=等しいか比べる(代入ではない)
等しくない(≠ は != と書いてもOK)
≤ / ≥以下 / 以上(<= / >= でもOK)
×かけ算(* でもOK)
÷わり算。答えの小数は捨てる(例: 7÷2=3)。/ でもOK
%わり算の余り(例: 7%2=1)
要素数(配列)配列の箱の数。2次元では 行数()・列数()
▲i / ▲j配列の下の三角は「いまコードが見ている位置」
algorithm.pseudo擬似言語 / IPA形式
1整数型の配列: data
2整数型: i, j, tmp
3for (i を 要素数(data) - 1 から 1 まで 1 ずつ減らす)
4 for (j を 1 から i まで 1 ずつ増やす)
5 if (data[j] > data[j + 1])
6 tmp ← data[j]
7 data[j] ← data[j + 1]
8 data[j + 1] ← tmp
9 endif
10 endfor
11endfor
実行を開始します

配列の可視化

箱の番号(添字)は 1 から始まります
▶ 整数型の配列: data
実行を開始します
data
5
[1]
3
[2]
8
[3]
6
[4]
2
[5]
7
[6]
4
[7]
1
[8]
← よこにスクロールできます →
まだ見ていないいま見ている数字を書きかえた完了
マスの下の ▲i は「いまコードが見ている位置」・ 棒の高さは数の大きさ
くらべた回数
0
書きかえた回数
0
読んだ回数
0
変数の状態(いまの値)
i=
位置(カウンタ)
j=
位置(カウンタ)
tmp=
一時置き場(入れ替え用)
1 / 127
速度

理解度チェック

解答すると、そのアルゴリズムが実際に動く様子を再生して確認できます。

確認問題 1

配列 data = {5, 3, 8, 1} を上のバブルソートで昇順整列する。外側ループ1巡目(i = 3)が終了した直後の配列はどれか。

確認問題 2

バブルソートが既に整列済みの配列に対して最良 O(n) を達成するには、どんな改良が必要か。

📊 計算量(速さの目安)— くわしく知りたい人向け

「計算量」は、データが増えたときに手間(時間)がどれくらい増えるかの目安です。n はデータの個数。記号の意味は各カードの下に書いてあります。

最良(いちばん速い場合)
O(n)
データの数に比例して増える(ふつう)
平均(ふつう)
O(n²)
データの数 × 数 で急に増える(遅い)
最悪(いちばん遅い場合)
O(n²)
データの数 × 数 で急に増える(遅い)
使う追加メモリ(空間)
O(1)
データが増えても一定(最速)

安定性:安定(安定 = 同じ値どうしの並び順が、並べ替えの前後で変わらないこと)

このサイトは、使い方を改善するためにアクセス解析(Google Analytics・Cookie)を利用します。