たまに必要になる配列のソートなのですが、Accessにはソート関数がありません。
そこで、C言語でよく使うクイックソートを作成してみます。
このソートはもっとも高速なアルゴリズムと言われています。
呼び出しは、AcQsort 配列名, 配列インデックスの最小,配列インデックスの最大
になります。
■ Access VBA 実行コード
Option Compare Database
Option Explicit
'配列の要素を交換
Private Sub AcSwap(tAy() As Long, ni1 As Integer, ni2 As Integer)
Dim nTemp As Long
nTemp = tAy(ni2)
tAy(ni2) = tAy(ni1)
tAy(ni1) = nTemp
End Sub
'クイックソート
Private Sub AcQsort(tAry() As Long, nLeft As Integer, nRight As Integer)
Dim i As Integer
Dim j As Integer
Dim nmid As Long
Dim npivot As Long
If nLeft < nRight Then
i = nLeft
j = nRight
'配列の中央
nmid = (nLeft + nRight) \ 2
'基準値
npivot = tAry(nmid)
Do
Do While tAry(j) > npivot
j = j - 1
Loop
Do While tAry(i) < npivot
i = i + 1
Loop
If i <= j Then
AcSwap tAry(), i, j
i = i + 1
j = j - 1
End If
Loop Until i > j
If j > nmid Then
AcQsort tAry(), i, nRight
AcQsort tAry(), nLeft, j
Else
AcQsort tAry(), nLeft, j
AcQsort tAry(), i, nRight
End If
End If
End Sub