ここでは バブルソート・選択ソート・クイックソート(高速ソート) の イメージ図解(ASCII 図) を使って、初心者でも「何が起きてるか」が一瞬でわかるように説明します。
1. バブルソート(Bubble Sort)
直感イメージ
左右の値を「隣同士で比べて、順番が逆なら交換する」を 端から端まで繰り返す 方法。
大きい値がだんだん“泡のように”一番右へ上がっていく。
動く図解(例:[5, 3, 4, 1] を昇順に)
[5, 3, 4, 1]
↑ ↑
5 と 3 を比較 → 入れ替え
[3, 5, 4, 1]
[3, 5, 4, 1]
↑ ↑
5 と 4 を比較 → 入れ替え
[3, 4, 5, 1]
[3, 4, 5, 1]
↑ ↑
5 と 1 を比較 → 入れ替え
[3, 4, 1, 5] ← 最大値が右端に“浮いた”
次の周回(1 つ短く端まで比べる):
[3, 4, 1, 5]
↑ ↑
3 と 4 → そのまま
[3, 4, 1, 5]
↑ ↑
4 と 1 → 入れ替え
[3, 1, 4, 5]
まだ続くが最終結果は:
[1, 3, 4, 5]
特徴
- わかりやすいが非常に遅い(O(n²))
- 小規模なら問題なし
2. 選択ソート(Selection Sort)
直感イメージ
「配列の中から最小値を探して、先頭と交換」
次は「2 番目以降で最小値を探して、2 番目と交換」…を繰り返す。
動く図解(例:[5, 3, 4, 1])
1回目:全体から最小値「1」を探す
[5, 3, 4, 1]
↑ ↑
先頭 最小値1
→ 1 と 5 を入れ替え
[1, 3, 4, 5]
2回目:残り [3, 4, 5] から最小「3」を探す
[1, 3, 4, 5]
↑
このままでOK
3回目:残り [4, 5]
[1, 3, 4, 5]
↑
最小は4 → 交換不要
最終結果:
[1, 3, 4, 5]
特徴
- 交換回数が少ない(最大 n 回)
- しかし比較回数が多い(O(n²))
- 実装が簡単で教科書的
3. クイックソート(Quick Sort)
※ “高速ソート” といえば普通これ。
直感イメージ
- 真ん中(pivot:基準値)を決める
- pivot より小さいグループ、大きいグループに分割(パーティション)
- その小グループ・大グループに対して 再帰的に同じことを繰り返す
「分割 → 分割 → … → 終わり」が基本形。
イメージ図(例:[5, 3, 8, 1, 4])
Pivot を 真ん中の「8」 とする例:
[5, 3, 8, 1, 4]
↑
pivot(8)
小さいグループ: [5, 3, 1, 4]
大きいグループ: []
大きいグループは空なので、小グループを再帰:
[5, 3, 1, 4]
↑
pivot = 1
小さい: []
大きい: [5, 3, 4]
また再帰:
[5, 3, 4]
↑
pivot = 3
小さい: []
大きい: [5, 4]
また再帰:
[5, 4]
↑
pivot = 4
小さい: []
大きい: [5]
すべて繋げると:
[1] + [3] + [4] + [5] + [8]
結果:
[1, 3, 4, 5, 8]
特徴
- 平均 O(n log n) で非常に速い
- Java の
Arrays.sortは実際には「デュアルピボットクイックソート」などの高速な亜種を使っている
ここまでを一枚にまとめたイメージ
- バブルソート:隣同士を何度も交換 → 大きい値が右端へ“泡上がり”
- 選択ソート:最小値を探して前から確定 → 交換は少ない
- クイックソート:pivot で分割して再帰 → とても高速
