エクセルVBAでコムソート
今回はコムソートCombSort
順番に
エクセルVBAでバブルソート ( ソフトウェア ) - 午後わてんのブログ - Yahoo!ブログ
http://blogs.yahoo.co.jp/gogowaten/14787146.html
↓
エクセルVBAでシェーカーソート ( ソフトウェア ) - 午後わてんのブログ - Yahoo!ブログ
http://blogs.yahoo.co.jp/gogowaten/14790656.html
↓
今回の記事
バブルソートやシェーカーソートでは左右の隣り合った数値を比較していた
コムソートは最初は離れたところと比較してから、だんだん近くのものと比較して最後に隣と比較する
1ループごとに比較する場所を近づけるわけで、この間隔は要素の個数÷1.3の小数点以下切り捨てた数値とある
最終的に隣(間隔1)と比較していって交換が発生しなくなったら整列完了
少ししか関係ないこと、Combの発音はコムに近いみたいだけど見た目からだと昆布だよなあ「b」はどこに行ったんだYO
Combの意味は昆布じゃなくて櫛なのね、髪の毛を梳かすときに最初から目の細かい櫛を使うと苦労するけど、目の粗い櫛から目の細かい櫛へ変えていくとラクに梳けるところが似ているから名前を付けたらしい、洒落ているなあ、でも昆布
それに梳かすとか梳くなんて漢字あったんだねえ
昆布と櫛は昆布と鰹節に似ているかも、どうでもいいNE
8個の数値を整列する場合
1ループ目
0番と1番を比較→1番と2番を比較→2番と3番を比較→...6番と7番を比較
2ループ目
0番と1番を比較→1番と2番を比較→2番と3番を比較→...5番と6番を比較
コムソート
1ループ目は8÷1.3=6.1=6個離れたところと比較
0番と6番を比較→1番と7番を比較
2ループ目は6÷1.3=4.6=4個離れたところと比較
0番と4番を比較→1番と5番を比較→2番と6番を比較→3番と7番を比較
3ループ目は4÷1.3=3.0=3個離れたところと比較
0番と3番→1番と4番→...
これをVBAで書くときは
ループする回数は決まっていない?のでDo~Loopを使うのが良さそうなんだけど条件設定間違えてよく無限ループになるんだよなあ
Do~Loopでループし続ける条件は
間隔が1より大きい
前回のループ中に交換が発生していた
このどちらかでも真Trueのとき
逆に言うとループを終了する条件は、間隔が1以下で前回のループで1回も交換が発生していなかったとき
これで書いたのがtestComb2
間隔を求めているQuotient関数は
h = WorksheetFunction.Quotient(h, 1.3)
割られる数値と割る数値を渡すと小数点以下切り捨てた値を返してくれる関数、こんな関数も用意されたいたんだねえ、便利
小数点と言えばRounDUpやRounDDownだと思っていた
h = WorksheetFunction.RoundDown(h / 1.3, 0)
これで1万件の並べ替え時間計測
計測のコードは前回と同じ↓
本当に正しく整列できているのか結果をセルに貼り付けてみる
A列に1万件の0から9999までのランダムな数値を入れて
これをtestComb1で整列してB列に貼り付ける
これを実行して
整列できているっぽい
目で見て確認するのはめんどくさいのでマクロで確認
Sheet3のB列が小さい順に並んでいたらTrueを表示する1箇所でも違っていたらFalseを表示するマクロ
これを実行して
結果
正しく整列できてます!
コムソートすご~い!
更に間隔が9か10になったときに11に変更するともっと早くなるとか
testComb2から付け足したのは13~15行目の
If h = 9 Or h = 10 Then
h = 11
End If
だけ
これのタイムは
えー、遅くなった
これは毎ループに間隔が9か10かチェックする処理が増えたからかなあ
1万件から100万件に変更して比較してみる
やっぱり遅くなるなあ、なんでだろ
書き方が良くないのかもしれないけど、わかんないなあ
あと気になるのが間隔の求め方、ループごとに間隔÷1.3の商を取っていくのがいいらしいけど、これを2にしたらどうなるんだろう、半分づつ縮めていくことになる
testComb2の
h = WorksheetFunction.Quotient(h, 1.3)
これを
h = WorksheetFunction.Quotient(h, 2)
に変えて1万件をソート
9.6秒wめちゃくちゃ遅くなったw
次は1.9
6.5859秒
次は1.4
0.2226
速い、けど1.3よりは遅い
次は1.2
0.1171
1.3のタイムに近づく1.25
0.0859
ほとんど1.3とほとんど同じタイムまとめ
いままでのまとめ
コムソート速い!
もしかして
2017年3月14日追記ここから
シェーカーソートを組み合わせても変わらないか誤差程度に遅くなった
前回のtestShaker2との組み合わせ
コムソートとシェーカーソートの組み合わせ
2017年3月14日追記ここまで
次
エクセルVBAで挿入ソート ( ソフトウェア ) - 午後わてんのブログ - Yahoo!ブログ
http://blogs.yahoo.co.jp/gogowaten/14799218.html
まとめ
エクセルVBAで、ソートアルゴリズムとデータの違いによるソート処理時間比較 ( ソフトウェア ) - 午後わてんのブログ - Yahoo!ブログ
https://blogs.yahoo.co.jp/gogowaten/14836198.html