§Algorithm§


☆クイックソート☆


 クイックソートは高速で、しかもプログラムコードも単純な実用的な ソート法でソート方法はきわめて簡単です。  まず軸になる値を決め、数列をそれより大きいものと小さいものとの グループに分けます。次にその2つのグループの数列に対しても同様のグループ 分け処理を行い、1つのグループ単位を徐々に小さくしていきます。 そして、何度かこの処理を繰り返し、ソートが完了する仕組みになっています。 この処理の反復には通常、再帰を用います。 クイックソートの流れは、以下のような感じになります。

Visual Basicのプログラムコードでは以下のようにまとめられます。 昇順ソートを示しています。

'===========================================================
'upQuickSort   指定された配列の整数を昇順ソートする
'---------引数----------------------------------------------
'data()   ここのデータをソートする
'lef      ソートする数列の左端の要素番号
'rig      ソートする数列の右端の要素番号
'===========================================================
Public Sub upQuickSort(data() As Integer, _
                      lef As Integer, rig As Integer)
    Dim temp As Integer

    '左端と右端が一致していたならプロシージャを抜ける
    If lef >= rig Then Exit Sub
    '軸の値にdata(lef)を設定
    i = lef + 1
    j = rig
    '左端要素番号 + 1 <= 右端要素番号の間
    Do While i <= j
        '軸の値data(lef)より大きい値を探す
        Do While i <= j
            '軸の値data(lef)より大きければ
            If data(i) > data(lef) Then
                Exit Do
            End If
            'この要素が軸の値data(lef)より小さい場合次の要素へ
            i = i + 1
        Loop
        '軸の値data(lef)より小さい値を探す
        Do While i <= j
            '軸の値data(lef)より小さければ
            If data(j) < data(lef) Then
                Exit Do
            End If
            'この要素が軸の値data(lef)より大きい場合次の要素へ
            j = j - 1
        Loop

        If i >= j Then Exit Do

        temp = data(j)
        data(j) = data(i)
        data(i) = temp

        i = i + 1
        j = j - 1
    Loop

    temp = data(j)
    data(j) = data(lef)
    data(lef) = temp
    Call upQuickSort(data, lef, j - 1)
    Call upQuickSort(data, j + 1, rig)
End Sub

やたらと(i <= j)がでてくるので、もうちょっとなんとかなりそうですね。 でも速度的にはシェルソートと比べても速いと思います。  一般的に、シェルソートと併用することでより高速なソート法となります。


(サンプルプログラムの動作確認)

機種 PC-9821V13S
OS Windows95
開発ツール Visual Basic Ver.4.0
更新日 00/2/5

ダウンロード QSort.lzh(2.38KB)

Visual Basic Ver.5.0,Ver.6.0でも問題なく動作すると思います。
なお、このコーナーに掲載されているプログラムコード、およびプログラムファ イルが原因で起きた損害などに関して一切の責任を負うことはできません。

★このコーナーに掲載されているプログラムコード、およびプログラムファ イルを無断で配布・転載することは、原則として禁止です。


Algorithmインデックス トップ


Copyright(C)1999 Tomoya. All rights reserved.