読者です 読者をやめる 読者になる 読者になる

雑記 - otherwise

最近はDQ10しかやっていないダメ技術者がちまちまと綴る雑記帳

ソート祭り?

わんくま VB(.NET)
  • (東方算程譚)
  • (東方算程譚)
  • (東方算程譚)
  • (東方算程譚)

わんくま方面で変な盛り上がりを見せている様なので、私も 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ソート実装してみました」系もやろうと思ったのだけれども、時間がなくて断念。
# それにしても、ソートアルゴリズムって、悉く忘れています。クイックソートですらググって確認した位。。。