バブルソート Bubble Sort
隣接する2つの要素を比較し、大小が逆であれば交換します。これを配列の端から繰り返すと、最も大きい値が「泡(バブル)」のように端へ移動して確定します。
1回の外側ループ(パス)が終わるごとに、未確定範囲の最大値が右端に確定します。下のコードを1ステップずつ実行し、黄色(比較中)と赤色(交換)のセルがどう動くか確かめましょう。
▶📖 記号の読み方(はじめての人はここを確認)
←代入(右の値を左の箱に入れる)。例: 合計 ← 0
=等しいか比べる(代入ではない)
≠等しくない(≠ は != と書いてもOK)
≤ / ≥以下 / 以上(<= / >= でもOK)
×かけ算(* でもOK)
÷わり算。答えの小数は捨てる(例: 7÷2=3)。/ でもOK
%わり算の余り(例: 7%2=1)
要素数(配列)配列の箱の数。2次元では 行数()・列数()
▲i / ▲j配列の下の三角は「いまコードが見ている位置」
algorithm.pseudo擬似言語 / IPA形式
1整数型の配列: data2整数型: i, j, tmp3for (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] ← tmp9 endif10 endfor11endfor
▶ 実行を開始します
配列の可視化
箱の番号(添字)は 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)
データが増えても一定(最速)
安定性:安定(安定 = 同じ値どうしの並び順が、並べ替えの前後で変わらないこと)