< 実行計画を調べる(SQLServer編) | 複数列のVLOOKUP >

September 29, 2003

私家版QuickSort

私家版VB用QuickSort関数です。

私家版といってももともとはWeb上のソースで、それに手を加え、手を加えしながら暖めているものです。
もう出展も忘れてしまいましたが、このロジックそのものは有名なので、まあいいでしょう。

Option Explicit

Private Const mcstrMODULE_NAME  As String = "CSort" '// モジュール名

Public Sub QSort(plngAry() As Long, ByVal plngStart As Long, ByVal plngEnd As Long)
'============= Declare ==============
Dim lngBasePos      As Long
Dim lngBaseVal      As Long
Dim lngCounter      As Long
Dim lngTemp         As Long
Dim i               As Long

'============= Initiarize ===========
On Error GoTo QSort_E00
    If plngStart >= plngEnd Then Exit Sub
    
'============= Main =================
    
    lngBasePos = (plngStart + plngEnd) \ 2&           '// 中央の要素番号を求める
    lngBaseVal = plngAry(lngBasePos)                '// 中央の値を軸値とする
    
    '// 軸位置に先頭要素を格納
    plngAry(lngBasePos) = plngAry(plngStart)
    lngCounter = plngStart
    
    '// 軸要素より小さければ先頭より詰めていく
    For i = (plngStart + 1&) To plngEnd
        If plngAry(i) < lngBaseVal Then
            lngCounter = lngCounter + 1&
            lngTemp = plngAry(lngCounter)
            plngAry(lngCounter) = plngAry(i)
            plngAry(i) = lngTemp
        End If
    Next i
    
    '// 前詰め最終要素→先頭
    '// 軸要素        →最終位置    (なんかスマートじゃないな)
    plngAry(plngStart) = plngAry(lngCounter)
    plngAry(lngCounter) = lngBaseVal
    
    '// 前詰め最終位置で分けて、再帰呼出
    Call QSort(plngAry, plngStart, lngCounter)
    Call QSort(plngAry, lngCounter + 1&, plngEnd)
    
'============= Release ==============
QSort_L00:
    Exit Sub
'============= Error ================
QSort_E00:
    Call Err.Raise(vbObjectError Or Err.Number, mcstrMODULE_NAME & ".QSort" & "(" & Err.Source & ")", Err.Description, Err.HelpFile, Err.HelpContext)

    Resume QSort_L00
End Sub

トラックバック

このエントリーにトラックバック:
http://frog.raindrop.jp/cgi-bin/mt/mt-tb.cgi/54

コメント

コメントする

※ コメントスパム対策のため、コメント本文はおはよう、こんにちわ、こんばんわのいずれかより始めるようにしてください。

name:
email:

※ 必要ですが、表示しません。

url:
情報を保存する ?