Excel(エクセル)で学ぶアルゴリズム:バブルソート

IT

バブルソートは、隣り合う数値の大小を比較しながら移動し、最大または最小値から順に確定させることで最終的にすべての数値をソートするアルゴリズムです。
数値が順番に移動する様子が水中の泡のように見えることから名付けられました。比較的単純で実装が容易な反面、処理数が多めです。
ちなみに、実際にExcelでソートをしたい時は、普通に並べ替えとフィルタもしくはSortメソッド/オブジェクトを使います。

スポンサーリンク

バブルソートの使い方

図のように、左右に大きさの異なる数値が並んでいるとします。この数値をバブルソートで並べ替えてみたいと思います。
左右どちらから始めてもいいですが、ここでは右端にあるふたつの数値(HとI)を比較し、
左の数値が右の数値より大きければ、左右を入れ替えます。今回はIのほうが大きいので、そのままです。
次にその左のふたつの数値(GとH)を比較します。
左(G)の数値(7)は右(I)の数値(2)より大きいので、左右を入れ替えて7を右にします。
また左に移動し、ふたつの数値を比較します。
8と2では8のほうが大きいので、左右を入れ替えて8を右に置きます。これを繰り返していくと、
一番左のふたつの数値を比較終了した時点で、最も小さい数値が一番左に来ることになります。
したがって、一番左のB列は確定します。
一番右から2ラウンドを始め、左から2つめと3つめの数値まで比較します。
左から二番目の数値は二番目に小さい数字になっているので、これも確定します。
この調子で最後のふたつの数値を比較するまでラウンドを回したら終了です。
数値が小さい順に左から並べられた状態になります。

VBAでバブルソート

割と簡単にコード化することもできます。
必要なのは全体の数と、
名称や座標、配列など、各数値を差別化できる情報です。
VBAで実際に使うことはそうそうないでしょうが、以下コードの一例です。
' vba
'待機処理
Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

'バブルソート
Dim 全体の数 As Integer: 全体の数 = 8
Dim ラウンド As Integer: ラウンド = 1
Dim 右のセル As Integer

'数字の数と等しいラウンドに到達したら終了
'左から計算し、大きい数値を右へ
Do Until ラウンド = 全体の数
For i = 2 To 全体の数 - ラウンド + 1
'左の数値のほうが大きい場合
If Cells(2, i) > Cells(2, i + 1) Then
'せっかくなので待機処理
Sleep 100
'一度代入
右のセル = Cells(2, i + 1).Value
'左の数値を右に
Cells(2, i + 1).Value = Cells(2, i).Value
'右の数値を左に
Cells(2, i).Value = 右のセル
End If
Next
'ラウンド数増加
ラウンド = ラウンド + 1
Loop
実行結果です。
Excel(エクセル):並べ替え、ソート
Excelの並べ替え、ソート関連操作方法、マクロなどまとめ記事です。 並べ替え方法 並べ替えとフィルターを使った範囲の並べ替え方法です。 昇順、降順についても言及しています。 漢字を含めた検索で読み方順に並ば...
やりたいことから方法を探すエクセル(Excel)操作・関数・VBA(マクロ)逆引きまとめ
逆引き(やりたいことから探す)Excel記事まとめ

コメント

モバイルバージョンを終了