【お知らせ】プログラミング記事の投稿はQiitaに移行しました。

クイックソート

クロージャが使えるようになったので、クイックソートを書いてみました。

function qsort(src : ArrayList, dest : ArrayList)
{
  if (src.Count == 0) return;
  
  var x = src.Ptr[0];
  ArrayList lt, ge;
  lt |< src.FindPartial(1, \y => y <  x);
  ge |< src.FindPartial(1, \y => y >= x);
  dest |< lt.qsort;
  dest |< Add(x);
  dest |< ge.qsort;
} 

パイプ演算子シンタックスシュガーですが、F#を参考にしました。

有名なHaskellクイックソートを意識しています。Haskellのコードは以下の通りです。

qsort []     = []
qsort (x:xs) = qsort lt ++ [x] ++ qsort ge
                 where
                   lt = [y | y <- xs, y <  x]
                   ge = [y | y <- xs, y >= x] 

Haskellの簡潔さには太刀打ちできませんが、今はこのくらいが限界です。