quick sort
http://web.yl.is.s.u-tokyo.ac.jp/~ganat/memo/aboutHaskell.html
ここに、Haskellのquick sortとCのquick sortがあります。
それを参考に、Concurrent Cleanでquick sortを、2種類、書いてみました。非破壊的なものと、破壊的なものの2種類です。
まず、通常の関数型の書き方で書いた、非破壊的なバージョン。
qsort :: [a] -> [a] | < a qsort [] = [] qsort [x:xs] = qsort elts_lt_x ++ [x] ++ qsort elts_greq_x where elts_lt_x = [y \\ y <- xs| y < x] elts_greq_x = [y \\ y <- xs| y >= x]
で、次は、一意型を使った破壊的なソート。
qsort :: *{#Int} -> *{#Int} qsort a # (hi, a) = usize a = qsort 0 (hi-1) a where qsort :: Int Int *{#Int} -> *{#Int} qsort lo hi a | lo >= hi = a # (p, a) = a![hi] (m, a) = loop p lo hi a a = swap m hi a a = qsort lo (m-1) a a = qsort (m+1) hi a = a where loop :: Int Int Int *{#Int} -> *(Int, *{#Int}) loop p l h a # (l, a) = search l ((>)h) ((>=)p) inc a (h, a) = search h ((<)l) ((<=)p) dec a | l < h # a = swap l h a = loop p l h a = (l, a) search :: Int (Int -> Bool) (Int -> Bool) (Int -> Int) u:{#Int} -> u:(Int, u:{#Int}) search s f g m a # (q, a) = a![s] | f s && g q = search (m s) f g m a = (s, a) swap :: Int Int *{#Int} -> *{#Int} swap i j a=:{[i]=ai,[j]=aj} = {a & [i]=aj,[j]=ai}