Quantcast
Channel: 午後わてんのブログ
Viewing all articles
Browse latest Browse all 420

エクセルVBAで挿入ソート

$
0
0


挿入ソート、InsertionSort

今までのバブルソートからコムソートは交換して並べ替えていた
挿入ソートは名前の通り挿入して並べ替えていく

3,5,6って整列されているところに4が来たら3と5の間に4を挿入
イメージ 1
挿入される側は整列されている必要があるので、配列でいったら左側から順番に比較挿入していけばいいことになる


5,3,6,4のときは
左から見ていくと5のところに3が来たので5の前に3を挿入
イメージ 2

次は3,5のところに6なので5の後ろに挿入
イメージ 3

次は3,5,6のところに4は3と5の間に挿入
イメージ 4

まとめると
イメージ 5
交換していくバブルソートよりこっちのほうが直感的かなあ、本棚の本を整列するときはこんな感じ

WikipediaにあるC言語で書かれたコードを真似しようとしてみたけど、うまくできなくて↓こうなった

Function testInsertion2(v As Variant) As Variant
Dim i As Long, j As Long
Dim tmp As Variant
For i = LBound(v) + 1 To UBound(v)
tmp = v(i)
For j = i - 1 To LBound(v) Step -1
If v(j) > tmp Then
v(j + 1) = v(j)
Else
Exit For
End If
Next
v(j + 1) = tmp
Next
testInsertion2 = v
End Function

適当な変数tmpに挿入する数値を入れておいて、tmp = v(i)
これを右から左の数値と比較していって、If v(j) > tmp Then
比較数値>tmpなら比較数値を右へコピー、v(j + 1) = v(j)
比較数値>tmpじゃなければ内側のループを抜ける、Exit For
最後にtmpを挿入して、v(j + 1) = tmp
次の外側ループへ

コードにするとバブルソートとあんまり変わらないんだよねえ、とくにtestBubble3とはかなり似ている

イメージ 8
やっぱりエクセル方眼紙は最高だな


処理時間計測
今までと同じように1万件のランダム数値を整列
イメージ 6
4.546秒
バブルソートは10秒だったので2倍以上速い!
意外に速いなあ


今までのまとめ
イメージ 7
コムソートだけ異次元



前回の記事
エクセルVBAでコムソート ( ソフトウェア ) - 午後わてんのブログ - Yahoo!ブログ
http://blogs.yahoo.co.jp/gogowaten/14795895.html

次回、挿入ソートの改良型シェルソート
エクセルVBAでシェルソート ( ソフトウェア ) - 午後わてんのブログ - Yahoo!ブログ
http://blogs.yahoo.co.jp/gogowaten/14801061.html



Viewing all articles
Browse latest Browse all 420

Trending Articles