ソート祭り?
わんくま方面で変な盛り上がりを見せている様なので、私も VB のお勉強の一環として頑張ってみました。(ちゃんと VB 9.0 で書いてみた。えっへん♪)
# この手の話に心躍るのが、でべろっぱぁの正しい姿だと思います。
一応、手元では 6 パターン位作ったのですが、ひとまず当たり障りのない(と云うか今回の回答としては不適切と思われる) 2 パターンだけ挙げておきます。
' 標準関数に丸投げ ' アクアさんがコメントで言っていたのがこの方法 ' 内部的にはクイックソート辺りを使っているんじゃないか、との噂だけど、真相は知らない Shared Sub SortPattern1(ByVal ary As Integer()) Array.Sort(ary) End Sub ' LINQ to Object ' ……ソートの話が挙がった際に真っ先に思いついたのがこの方法 ' 最近、 LINQ を中心にプログラムを考えている様な気がしてならない。。。 Shared Sub SortPattern2(ByVal ary As Integer()) Dim linq = From i In ary Order By i Select i Dim result = linq.ToArray() ' 実は意外と面倒 For i As Integer = 0 To ary.Length - 1 ary(i) = result(i) Next i End Sub
……どっちもアルゴリズムほとんど関係ないです。(所詮、組み込みの関数呼んでるだけだし)
なので、これなら epi 先生から怒られないのではないかと。……大丈夫ですよね? のんちゃんのお勉強の妨げにならなければ成功。 :p
ちなみに、これ以外の 4 つは、選択ソート、バブルソート、クイックソート、マージソートで実装してみました。(ソース提示は自重します。のんちゃんのお勉強の範疇だし)
ちょっと(アルゴリズムそのものに)自信がなかったので、まず C# で試し実装→ VB で組み直しの手順でやっていたのですが、変なところで C# と VB の違いに惑わされて意外と大変でした。。。
今回、 C# と VB の違いで(特に)困った点。
- 配列初期化時にサイズを指定したつもりが 1 個多かった( VB はインデックスの最大値を指定する。。。)
- Integer 同士の除算 (Integer / Integer) 結果が Integer で返ってこない( C# も Perl も商が返ってくるので油断しました)
- 複数条件で条件文を書いた際の挙動が違う( VB(.net) で「 If A IsNot Nothing And A.CompareTo(B) Then ..」と書くと、 A が Nothing の時に NullReferenceException になってしまう)
なんでコンパイルした先が一緒なのに、ここまで挙動が違うの。。。
# 本当は「 Perl でXXソート実装してみました」系もやろうと思ったのだけれども、時間がなくて断念。
# それにしても、ソートアルゴリズムって、悉く忘れています。クイックソートですらググって確認した位。。。