午後わてんのブログ

ベランダ菜園とWindows用アプリ作成(WPFとC#)

エクセルVBAで挿入ソート

 
 
挿入ソート、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
まとめ
エクセルVBAで、ソートアルゴリズムとデータの違いによるソート処理時間比較 ( ソフトウェア ) - 午後わてんのブログ - Yahoo!ブログ
https://blogs.yahoo.co.jp/gogowaten/14836198.html