1. ホーム
  2. arrays

[解決済み] VBAの配列ソート機能?

2023-02-18 01:35:46

質問

VBAで配列の適切なソート実装を探しています。Quicksortが望ましいです。または他の ソートアルゴリズム は、バブルやマージ以外で十分でしょう。

これはMS Project 2003で動作するものなので、Excelのネイティブ関数や.netに関連するものは避けるべきであることに注意してください。

どのように解決するのですか?

ご覧ください。 ここで :

編集します。 参照したソース(allexperts.com)はその後閉鎖されましたが、以下は関連するものです。 著者 のコメントです。

Web上には、ソートのための多くのアルゴリズムが存在します。 最も汎用性が高く、通常、最も速いのは クイックソート(Quicksort)アルゴリズム . 以下はそのための関数です。

値の配列(文字列か数値。関係ない)を 配列の下限 (通常は 0 ) と アレイ上部バウンダリ (すなわち UBound(myArray) .)

: Call QuickSort(myArray, 0, UBound(myArray))

出来上がったら myArray はソートされ、あなたはそれを使って好きなことをすることができます。

(出典 アーカイブ.org )

Public Sub QuickSort(vArray As Variant, inLow As Long, inHi As Long)
  Dim pivot   As Variant
  Dim tmpSwap As Variant
  Dim tmpLow  As Long
  Dim tmpHi   As Long

  tmpLow = inLow
  tmpHi = inHi

  pivot = vArray((inLow + inHi) \ 2)

  While (tmpLow <= tmpHi)
     While (vArray(tmpLow) < pivot And tmpLow < inHi)
        tmpLow = tmpLow + 1
     Wend

     While (pivot < vArray(tmpHi) And tmpHi > inLow)
        tmpHi = tmpHi - 1
     Wend

     If (tmpLow <= tmpHi) Then
        tmpSwap = vArray(tmpLow)
        vArray(tmpLow) = vArray(tmpHi)
        vArray(tmpHi) = tmpSwap
        tmpLow = tmpLow + 1
        tmpHi = tmpHi - 1
     End If
  Wend

  If (inLow < tmpHi) Then QuickSort vArray, inLow, tmpHi
  If (tmpLow < inHi) Then QuickSort vArray, tmpLow, inHi
End Sub

これは 一次元の (別名 "normal"?) 配列でのみ動作することに注意してください。 (動作する多次元配列のQuickSortがあります。 はこちら .)