« [VB6.0] 時間計測 | メイン | [VB6.0] 文字列バイトチェック »

2005年08月10日

[VB6.0] 配列のソート

'-----------------------------------------------------
' 配列ソート(String)
'
' 引数:
' strArray()   = 配列名
' lngStart     = ソートを開始する要素番号
' lngEnd       = ソートを終了する要素番号
'
'-----------------------------------------------------
Public Sub StrQuickSort _
    (ByRef strArray() As String, _
     ByVal lngStart As Long, _
     ByVal lngEnd As Long, _
     Optional ByVal lngCompare As Long)


Dim lngBaseNumber As Long '中央の要素番号を格納する変数
Dim lngBaseValue As String '基準値を格納する変数
Dim lngCounter As Long '格納位置カウンタ
Dim lngBuffer As String '値をスワップするための作業域
Dim i As Long 'ループカウンタ

If lngStart >= lngEnd Then Exit Sub '終了番号が開始番号以下の場合、プロシージャを抜ける
lngBaseNumber = (lngStart + lngEnd) \ 2 '中央の要素番号を求める
lngBaseValue = strArray(lngBaseNumber) '中央の値を基準値とする
strArray(lngBaseNumber) = strArray(lngStart) '中央の要素に開始番号の値を格納
lngCounter = lngStart '格納位置カウンタを開始番号と同じにする
For i = (lngStart + 1) To lngEnd Step 1 '開始番号の次の要素から終了番号までループ
If strArray(i) < lngBaseValue Then '値が基準値より小さい場合
lngCounter = lngCounter + 1 '格納位置カウンタをインクリメント
lngBuffer = strArray(lngCounter) 'strArray(i) と strArray(lngCounter) の値をスワップ
strArray(lngCounter) = strArray(i)
strArray(i) = lngBuffer
End If
Next i
strArray(lngStart) = strArray(lngCounter) 'strArray(lngCounter) を開始番号の値にする
strArray(lngCounter) = lngBaseValue '基準値を strArray(lngCounter) に格納
Call StrQuickSort(strArray(), lngStart, lngCounter - 1) '分割された配列をクイックソート(再帰)
Call StrQuickSort(strArray(), lngCounter + 1, lngEnd) '分割された配列をクイックソート(再帰)

End Sub

'-----------------------------------------------------
' 配列ソート(Long)
'
' 引数:
' strArray()   = 配列名
' lngStart     = ソートを開始する要素番号
' lngEnd       = ソートを終了する要素番号
'
'-----------------------------------------------------
Public Sub LngQuickSort _
    (ByRef lngArray() As Long, _
     ByVal lngStart As Long, _
     ByVal lngEnd As Long)

Dim lngBaseNumber As Long '中央の要素番号を格納する変数
Dim lngBaseValue As Long '基準値を格納する変数
Dim lngCounter As Long '格納位置カウンタ
Dim lngBuffer As Long '値をスワップするための作業域
Dim i As Long 'ループカウンタ

If lngStart >= lngEnd Then Exit Sub '終了番号が開始番号以下の場合、プロシージャを抜ける
lngBaseNumber = (lngStart + lngEnd) \ 2 '中央の要素番号を求める
lngBaseValue = lngArray(lngBaseNumber) '中央の値を基準値とする
lngArray(lngBaseNumber) = lngArray(lngStart) '中央の要素に開始番号の値を格納
lngCounter = lngStart '格納位置カウンタを開始番号と同じにする
For i = (lngStart + 1) To lngEnd Step 1 '開始番号の次の要素から終了番号までループ
If lngArray(i) < lngBaseValue Then '値が基準値より小さい場合
lngCounter = lngCounter + 1 '格納位置カウンタをインクリメント
lngBuffer = lngArray(lngCounter) 'lngArray(i) と lngArray(lngCounter) の値をスワップ
lngArray(lngCounter) = lngArray(i)
lngArray(i) = lngBuffer
End If
Next i
lngArray(lngStart) = lngArray(lngCounter) 'lngArray(lngCounter) を開始番号の値にする
lngArray(lngCounter) = lngBaseValue '基準値を lngArray(lngCounter) に格納
Call LngQuickSort(lngArray(), lngStart, lngCounter - 1) '分割された配列をクイックソート(再帰)
Call LngQuickSort(lngArray(), lngCounter + 1, lngEnd) '分割された配列をクイックソート(再帰)

End Sub

2005 / 08 / 10