VBAで配列をソートするためのユーザー定義関数

VBAにはソートに関する関数が見当たりません。
そこで作ってみました。

バブルソート

Function bubble_sort(ar)
    num = UBound(ar)
    For i = 0 To num - 1
        For j = i + 1 To num
            If ar(i) > ar(j) Then
                temp = ar(i)
                ar(i) = ar(j)
                ar(j) = temp
            End If
        Next j
    Next i
End Function

選択ソート

Function selection_sort(ar)
    num = UBound(ar)
    For i = 0 To num - 1
        mini = ar(i)
        k = i
        For j = i + 1 To num
            If ar(j) < mini Then
                mini = ar(j)
                k = j
            End If
        Next j
        temp = ar(i)
        ar(i) = ar(k)
        ar(k) = temp
    Next i
End Function

使い方

Sub test()
    Dim ar(2) As Double
    ar(0) = 3.5
    ar(1) = 2.1
    ar(2) = 3.2
    Call bubble_sort(ar)
End Sub

配列(1次元)を作ります。値は倍精度としました。
「Call bubble_sort(ar)」として関数を呼び出すと与えた配列をソートします。
この後の配列変数はソートが反映されています。

試しに1万件の処理速度を調べたところ、バブルソートを100とすると選択ソートは25でした。

昇順にのみ対応しています。
Excelで使うことを想定していますが、Wordでも使えます。
数値のソートに対応していますが、文字列のソートには対応していません。Wordで使うには文字列のソートに対応する必要があるかもしれません。

コメント

  1. 大塚 より:

    bubble_sort(ar) 挙動がおかしいです。
    「 For j = i + 1 To num」→「 For j = i + 1 To num-1」ですね。

  2. stabucky より:

    大塚さん
    確認しましたが、元のままでいいと思います。

タイトルとURLをコピーしました