隣り合う要素を比較して、大きい方を右に移動させる操作を繰り返します。 1回のパスで最大値が末尾に「泡(バブル)のように浮き上がる」ことからこの名前がついています。
○ bubble_sort(整数型の配列: a)
整数型: i, j, tmp
整数型: n ← a の要素数
for ( i を 1 から n - 1 まで 1 ずつ増やす )
for ( j を 1 から n - i まで 1 ずつ増やす )
if ( a[j] が a[j + 1] より大きい )
tmp ← a[j] // 隣り合う要素を交換
a[j] ← a[j + 1]
a[j + 1] ← tmp
endif
endfor
endfor
n - i の理由:未整列部分の中から最小値を探して先頭と交換する操作を繰り返します。 毎回「最小値を選択(select)する」ことからこの名前がついています。
○ selection_sort(整数型の配列: a)
整数型: i, j, min_idx, tmp
整数型: n ← a の要素数
for ( i を 1 から n - 1 まで 1 ずつ増やす )
min_idx ← i // 未整列部分の先頭を暫定最小とする
for ( j を i + 1 から n まで 1 ずつ増やす )
if ( a[j] が a[min_idx] より小さい )
min_idx ← j // より小さい要素が見つかれば更新
endif
endfor
// min_idx の要素を先頭(i)と交換
tmp ← a[i]
a[i] ← a[min_idx]
a[min_idx] ← tmp
endfor
| 項目 | バブルソート | 選択ソート |
|---|---|---|
| 考え方 | 隣り合う要素を比べて交換 | 最小値を探して先頭と交換 |
| 交換のタイミング | 比較のたびに(多い) | 1パスに1回(少ない) |
| 内側ループの役割 | 隣接比較・交換 | 最小値の位置を探す |
| 共通点 | どちらも2重ループ。要素数 n に対して比較回数は約 n²/2 回 | |
a[j] と a[j+1])があればバブルソート、
最小値インデックス(min_idx)を持つのが選択ソートの特徴です。
バブルソートで {4, 2, 7, 1, 5} を昇順に並び替えるとき、パス1(i=1)終了後の配列はどれか。
選択ソートで {5, 3, 4, 1, 2} を昇順に並び替えるとき、パス1(i=1)終了後の配列はどれか。
次のバブルソートのコードで、空欄 [ A ] に入るものを選びなさい。
for ( i を 1 から n - 1 まで 1 ずつ増やす )
for ( j を 1 から [ A ] まで 1 ずつ増やす )
if ( a[j] が a[j + 1] より大きい )
// 交換処理
endif
endfor
endfor
n - i が正解です。n - 1 にすると確定済み要素も毎回比較してしまい非効率です(動作は正しいですが)。
次の選択ソートのコードで、空欄 [ B ] に入るものを選びなさい。
for ( i を 1 から n - 1 まで 1 ずつ増やす )
min_idx ← i
for ( j を i + 1 から n まで 1 ずつ増やす )
if ( a[j] が a[min_idx] より小さい )
[ B ]
endif
endfor
// i と min_idx を交換
endfor
次のコードはバブルソートと選択ソートのどちらか。またソート後の配列はどれか。
整数型の配列: a ← {3, 1, 4, 2}
整数型: i, j, tmp
整数型: n ← 4
for ( i を 1 から n - 1 まで 1 ずつ増やす )
for ( j を 1 から n - i まで 1 ずつ増やす )
if ( a[j] が a[j + 1] より大きい )
tmp ← a[j]
a[j] ← a[j + 1]
a[j + 1] ← tmp
endif
endfor
endfor
a[j] と a[j+1] を比較して隣接交換しているのでバブルソートです。