基準値を配列の中から選んで基準値以上の値を配列の右へ、基準値以下は左へ寄せてから基準値の場所で配列を二分割、この処理を分割した配列それぞれで繰り返す
'vが配列、tは並び替える範囲の先頭の添字(index)、bは最後尾の添字
これと
これの組み合わせで使う
配列を並べ替えるなら
こう
セルの値を並べ替えるなら
1万件のランダム数値をソートするときの処理時間計測
OS:Windows 10
Excel2007
CPU:PhenomⅡ X3 720BE @3.0GHz
の環境で
計測するマクロはいつもの
評判通りの最速
1回1回計測するとタイムがばらつくので
10回連続で処理しての平均
0.03秒!
これまで一番速かったコムソートとシェルソートの0.0625秒の2倍速い!
グラフで
1秒以下のものだけと比較
100万件をソート
件数を増やしても速くて4秒台で
これもコムソート、シェルソートの2倍速い
今までのまとめ
まともなクイックソートを書いたここまで来るのに1ヶ月かかった
最後の方にある
If r + 1 < b Then Call QuickSort4(v, l, b) '分割の右側
これ
分割した右側の配列を再帰処理に行くかどうかの判定の
If r + 1 < b Then
これが思いつかなくて同じ数値がある場合に無限ループになっていた
rは右側から左へ探索した基準値以下の数値の場所
bは探索範囲の最後尾の場所
たしか
If l < b Then
って書いてたのかな、これだと同じ数値がある場合には無限ループ
これを解消するのに色々遠回りな継ぎ接ぎをしてできたクイックソートが3秒もかかる代物でぜんぜんクイックじゃなかったwここでクイックソートは諦めて基本って言われるバブルソートを書いていて、Wikipediaを見ていたら他にも色々なソート方法があるのを知っていろいろ試して1ヶ月、やっとクイックなクイックソートが書けた。書けたといってもしっくりこないというかなんかイマイチ納得いかないというか相性が良くないのかなあ、1番速いんだけどねえ。速さで驚いたのはコムソートとシェルソート!バブルソートの10秒台や偽クイックソートが3秒のところに0.06秒だったからホント驚いた、それにコードにするのもすんなりできた
マージソートはクイックソートでも使っているけど再帰処理ってのが少しわかったかなあ、でも頭がこんがらがる、こんがらがるって言葉も面白いなあ、いったんマージソートも書けたぞってググっていたら再帰処理を使わないボトムアップ型ってのもあってこれで書いたら2倍も速くなったのは面白かった
ヒープソートはWikipedia見ても全くわからなかったんだよねえ、まずヒープってのが何なのかからググってなんとなくわかった気になって、でもわかって無くてを何回か繰り返してなんとか書いた感じ、だから記事もあとから見ても思い出せるようにって書いたからあんなに長くなった
1次元配列の並べ替え(バブルソート,クイックソート)|ExcelマクロVBAサンプル集こちらの方のコードとそっくりで驚くと同時に、ああこれであっているんだという安心感
http://excel-ubara.com/excelvba5/EXCELVBA228.html
次回はソートする値(配列)の状態によってどんなふうに処理時間が変わるのか、変わらないのか
前回
エクセルVBAでヒープソート ( ソフトウェア ) - 午後わてんのブログ - Yahoo!ブログ
https://blogs.yahoo.co.jp/gogowaten/14814563.html
次回
エクセルVBAで、ソートアルゴリズムとデータの違いによるソート処理時間比較 ( ソフトウェア ) - 午後わてんのブログ - Yahoo!ブログ
https://blogs.yahoo.co.jp/gogowaten/14836198.html