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