VBAで配列をクイックソートする

ヘッダー広告
スポンサードリンク

データの並び替えを行うアルゴリズムはいくつか存在しますが、今回はその中でも一番効率良く高速であるとされているクイックソートをVBAで行う方法についてです。
配列の並び替え等によく使われるので、覚えておくといいでしょう。

クイックソート

クイックソートモジュール

こちらが配列をクイックソートするモジュールです。

●モジュール名:QuickSort

Option Explicit

'与えられた配列データを昇順に並び替える
Public Sub Sort(sort_data As Variant)

  Dim left As Long
  Dim right As Long
  
  left = LBound(sort_data)
  right = UBound(sort_data)
  
  Call Quick_Sort(sort_data, left, right)

End Sub

'クイックソートプロシージャ
Private Sub Quick_Sort(ByRef sort_data As Variant, ByVal left As Long, ByVal right As Long)
    
    If left >= right Then
        Exit Sub
    End If
    
    Dim pivot As Long
    Dim l_hold As Long
    Dim r_hold As Long
    
    pivot = sort_data(Int((left + right) / 2))
    
    l_hold = left
    r_hold = right
         
    Dim tmp As Long
    
    Do While (l_hold <= r_hold)
    
        Do While (sort_data(l_hold) < pivot)
            l_hold = l_hold + 1
        Loop
        Do While (sort_data(r_hold) > pivot)
            r_hold = r_hold - 1
        Loop
        
        If l_hold <= r_hold Then
            tmp = sort_data(l_hold)
            sort_data(l_hold) = sort_data(r_hold)
            sort_data(r_hold) = tmp
            l_hold = l_hold + 1
            r_hold = r_hold - 1
        End If
        
    Loop
    
    Call Quick_Sort(sort_data, left, r_hold)
    Call Quick_Sort(sort_data, l_hold, right)
    
End Sub

クイックソートモジュールを使ってみる

では先ほどのクイックソートモジュールをテストしてみます。

テスト用のプログラムは以下のものです。

●モジュール名:QuickSortTest

Option Explicit

'クイックソートテスト用プログラム
Public Sub Main()

    Dim array_data As Variant
    
    array_data = Array(4, 3, 10, 13, 2, 4, 1, 8, 2, 7)
    
    Debug.Print "?\?[?g?O"
    Call DebutPrintData(array_data)
    
    Call Sort(array_data)
    
    Debug.Print "?\?[?g??"
    Call DebutPrintData(array_data)


End Sub

'配列の値を全て出力する。
Private Sub DebutPrintData(ByRef array_data As Variant)
    
    Dim i As Long
    
    For i = 0 To UBound(array_data)
        
        Debug.Print array_data(i)
    
    Next

End Sub

では実行結果を見てみましょう。

ソート前 4 3 10 13 2 4 1 8 2 7

ソート後 1 2 2 3 4 4 7 8 10 13

このようにarray_data配列の中身が値の小さい順に並び替えられたことが分かるかと思います。

このような方法でVBAでクイックソートを実現することが可能です。
是非VBAで配列を並び替える際に利用してみてください。

もし配列の中に値が存在するかをチェックするロジックを作成したい場合には、vbaで配列内を高速で検索する(二分探索)の記事をご覧ください。

フッター広告

スポンサードリンク



シェアする

  • このエントリーをはてなブックマークに追加

フォローする