VBAでクイックソート

前にVBAでバブルソートと選択ソートを行うためのユーザー定義関数を紹介しましたが、今回はクイックソートについて作ってみました。

追記(2015年8月31日)
改良版について記事を書きました。

しかし、VBAの配列の使い方を理解していないため、うまくいかず、やむを得ず、文字列を使ってソートしています。
つまり、配列の代わりにカンマ区切りの文字列を使った関数(quick_csv)を作り、こちらで処理しています。なお実際には私の好みでカンマではなくセミコロンを使っています。
別の関数(quick_sort)で配列から文字列に変換し、クイックソートを行い、また配列に戻しています。

Function quick_sort(arrs)
    Dim csv
    csv = Join(arrs, ";")
    csv = quick_csv(csv)
    recs = Split(csv, ";")
    quick_sort = recs
End Function
Function quick_csv(csv)
    Dim arrs
    Dim num As Long
    Dim pivot As Double
    Dim i As Long
    Dim x As String
    Dim y As String
    Dim b As String
    arrs = Split(csv, ";")
    num = UBound(arrs)
    If num < 1 Then
        quick_csv = csv
    Else
        pivot = arrs(num)
        x = ""
        y = ""
        For i = 0 To num - 1
            If arrs(i) - pivot < 0 Then
                x = x & arrs(i) & ";"
            Else
                y = y & arrs(i) & ";"
            End If
        Next i
        If Len(x) > 0 Then
            x = Left(x, Len(x) - 1)
            x = quick_csv(x)
        End If
        If Len(y) > 0 Then
            y = Left(y, Len(y) - 1)
            y = quick_csv(y)
        End If
        b = ""
        If Len(x) > 0 Then
            b = b & x & ";"
        End If
        b = b & pivot
        If Len(y) > 0 Then
            b = b & ";" & y
        End If
        quick_csv = b
    End If
End Function

処理速度を比較したところ、20000件の処理にかかる時間を、バブルソートを100とすると、選択ソートは23、クイックソートは平均で13でした。

コメント

  1. […] 前にVBAでクイックソートをする方法を紹介しましたが、配列の扱いがよく分からず、CSVに変換して行う方法でした。 今回、配列の処理方法が分かったので、コードを書き直してみました。 処理が劇的に速くなりました。バブルソートなど他のソートとは比較になりません。 […]

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