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}