- ベストアンサー
ソートの時間比較について
- ソートする際の時間比較についてバブルソート、挿入ソート、選択ソートの順番で計測すると、バブルソートが一番時間がかかり、挿入ソートが次に、選択ソートが一番時間が短い結果となります。
- 上記のVBAコードで実装されているバブルソート、挿入ソート、選択ソートのアルゴリズムは、比較回数と交換回数を計測しています。
- それぞれのソートアルゴリズムの特徴は、バブルソートは隣り合う要素を比較し、順番が逆であれば交換します。挿入ソートは要素を挿入する位置を探し、その位置に挿入します。選択ソートは最小値(または最大値)を探し、先頭の要素と交換します。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
ソートの具合を見るために Calculateをしているとしてもこれを呼び出す回数とこのときのExcel側の負荷の違いによって時間比較の意味がなくなってしまうように思います 先にどれぐらいの回数ここが実行されるのかを見当をつけ Collectionオブジェクトなどに追加して保存しておきます ソート実行後にこのコレクションを使ってグラフ更新などのアニメーションをする方向で考えてみてはいかがでしょう コレクションオブジェクトに追加していく負荷がどれくらいか検証していないので申し訳ありませんが グラフの更新よりかは少ない負荷だと思います
その他の回答 (1)
- redfox63
- ベストアンサー率71% (1325/1856)
Excelでやるなら Excelに起因する時間のロスを排除して比較しないと意味がないと思いますよ Cellsは時間がかかるので if文や値の更新用に使っている部分で時間的なロスが発生します この比較や参照、代入の回数に差がある場合時間的な比較が意味を成さなくなります 最初にヴァリアント型の配列などに読み込んでしまって3種類の方法で同じ条件にして見ましょう 各マクロの先頭部分で dim v n = Cells(2,3) v = Range("A1:A" & n ) といった具合に 変数vにデータを読み込んでしまいます 後はif文など Cells(j,1).Value といった部分を v(j,1) といった具合に置き換えます iのループの中で Calculateを実行していますがこれは本当に必要なのでしょうか これもExcel側に起因する要因になると思いますよ これらの素因を排除して4096個の要素で実行した結果 選択法 挿入法 交換法 8386560 4199386 8386560 3698034 4199386 4199386 25.0659 19.5680 26.9780 当方の非力なマシンのではこのようになりました 交換法 > 選択法 > 挿入法
お礼
おっしゃるとおり配列に読み込むと正しい結果になりました。 ちなみに、office2007でグラフ描画なんかやってみると 10倍くらい遅くなります・・・
補足
何故に必要もないcalculate入っているのかが今回のミソなんです。 実はグラフがあって、これにソートをしながら描写してソートを視覚的に確認したいというのがあります。 (再計算を手動にしないと遅くて動かないし、かといって再計算しないと最初と終わりしか表示できない) なにかうまいこと回避する方法はないでしょうか? (グラフではない描写の仕方を考えるべき?) dim v n = Cells(2,3) v = Range("A1:A" & n ) こんなことが出来るんですね。いつも配列を使っていたんですがこれをやれば一発ですね。ありがとうございます。
お礼
うまくいきました。ありがとうございます。