エクセルVBAでシェーカーソート
前回のバブルソートからの続き
エクセルVBAでバブルソート ( ソフトウェア ) - 午後わてんのブログ - Yahoo!ブログ
http://blogs.yahoo.co.jp/gogowaten/14787146.html
シェーカーソート
基本はバブルソートと同じで左右の数値を比較して左が大きければ数値を交換
違いは
- バブルソートでは左から右へを繰り返していたのを左右交互
- 1ループごとに比較範囲を1個づつ狭くしていくだけだったのを効率化
っていう改良を加えたものらしい
比較範囲の効率化
バブルソートで2,1,4,3,2,5,6,7を小さい順に並べ替えるときの1ループ目
2ループ目の比較範囲は1つ狭くして1,2,3,2,4,5,6だった
でも最後の右端から見て連続3回交換が発生していない4,5,6の部分、これはもう順番通りに並んでいるってことなので省くことができる
なので2ループ目は3つ狭くした1,2,3,2の範囲だけ比較していけばいいことになる
前回のバブルソートのtestBubbleを元にしてシェーカーソート(仮)に書き直したのが
testShaker1
交換が発生しなかったら回数を変数cにカウントして、交換が発生したらその時点でカウントをリセット、これで最後から見ての連続非交換回数がわかるのでループの最後に探索範囲右端の変数rから引き算
r = r - c - 1
-1しているのは通常の毎ループから1狭くできるからその分
1ループ目が終わったところカウントは3
次の探索範囲の右端はr-c-1=6-3-1=2になる
2になった
探索範囲が0以下なら並べ替え完了なのでループを抜ける
1,2,3,4なら1ループ目で探索範囲がマイナスになる
ループ回数は並べ替え要素の個数-1だけどその前に並べ替えが終わることもある
その時は探索範囲がマイナスになるのが目安
これで探索範囲の効率化はできたのであとは左から右への探索を付け足せばシェーカーソートになるはず
左から右へっていう逆方向を単純に付け足しただけだから2倍の行数になったw
逆方向からも探索して、範囲も狭くしていって探索範囲が交差(0以下)になったら並べ替え完了なので外側のループのFor i ~ NextはDo ~ Loopにした方がいいかも
これtestShaker2でタイム計測
計測方法は前回と同じ1万件のランダム数値の並べ替え
testShaker2
testBubble2の改変だから2秒近く速くなった
testBubble3をシェーカーソートにした場合はどうかな
testShaker3
おお、速くなった
前回のバブルソートと比べてみる
改良版だけあって速くなっているねえ
シェーカーソートはほとんど並べ替えができているときは速いってことだし、仕組みを見てもそのとおりだと思う、どれくらい速いのか
A列にほとんど並べ替えが終わっている数値を1万件、A8だけ違う順番になっている、これを並べ替えてB列に貼り付ける処理をバブルソートとシェーカーソートでタイム計測
結果
続き
エクセルVBAでコムソート ( ソフトウェア ) - 午後わてんのブログ - Yahoo!ブログ
http://blogs.yahoo.co.jp/gogowaten/14795895.html
まとめ
エクセルVBAで、ソートアルゴリズムとデータの違いによるソート処理時間比較 ( ソフトウェア ) - 午後わてんのブログ - Yahoo!ブログ
https://blogs.yahoo.co.jp/gogowaten/14836198.html