VBAでのクイックソート

今、このページを見ているということは、よほど高速に処理したいということではないかと思います。

高速な並べ替えと言えば「クイックソート」です。一般的にはいろんなソート処理の中でも最速と言われています。ただ、「最速」といっても一般的にであって、ほとんど整列済みのデータの場合は挿入ソートの方が速いなど、一概に最速とは言えない点もあります。また、高速ではあるものの仕組みが複雑なため、当然、実装も複雑になる欠点があります。

そして、こんなページを書いておきながらなんですが、「どうにかこうにか高速に並べ替え処理したい」という場合であれば、VBAでクイックソートを実装するのではなくVBAから離れる(ソート部分を別の仕組みにしたり、C言語等のライブラリを使うなどする)のも一つの方法です。とはいえ、そういう話になるともうExcel効率化というよりもシステム開発の感じにはなりますね。

他のソートについては以下をご参照ください。
VBAの配列をバブルソートで並べ替え
VBAの配列を挿入ソートで並べ替え
VBAの配列を.NETのArrayListのSortで並べ替え
VBAの配列を逆順に並べ替え

クイックソートの仕組み

以下のクイックソート関数の仕組みを簡単に説明します。

  1. 配列の中の中央の要素値を取得する。(中央要素値とします)
  2. 配列を先頭から見ていき、中央要素値以上の値を探す。
  3. 配列を最後から見ていき、中央要素値以下の値を探す。
  4. それぞれ見つかった位置が先頭から探した方が、最後から探した方より右にある場合は中央要素値以上、以下の値の探索を終了する。
  5. 上記の条件に合致しない場合は、見つかった大小の値を入れ替える。
  6. 先頭を1つ右に、最後を1つ左にずらして、再度2.に戻る。
  7. 中央値の左側を再帰でクイックソートする。
  8. 中央値の右側を再帰でクイックソートする。

コード

以下の関数は引数で渡された一次元配列の並び順をクイックソートで昇順に並べなおします。

引数は配列、ソート開始位置、ソート終了位置の3つがあります。

2番目と3番目の引数は配列の一部だけをソートしたい場合に設定します。通常は省略して構いません。

昇順ではなく降順にしたい場合は、大小比較や入れ替え部分を反対にすれば可能になります。

または別ページ「VBAの配列を逆順に並べ替え」のようなコードで昇順と降順を入れ替えるのもありです。

利用方法

利用方法はこのような感じになります。

ソート後は、以下の順になります。