2 This module implements a sort function using a variation on
3 quicksort. It is stable, uses no concatenation and compares
6 sortLe sorts with a given predicate
7 sort uses the <= method
9 Author: Lennart Augustsson
12 module QSort(sortLe, sort) where
13 sortLe :: (a -> a -> Bool) -> [a] -> [a]
14 sortLe le l = qsort le l []
16 sort :: (Ord a) => [a] -> [a]
17 sort l = qsort (<=) l []
19 -- qsort is stable and does not concatenate.
22 qsort le (x:xs) r = qpart le x xs [] [] r
24 -- qpart partitions and sorts the sublists
25 qpart le x [] rlt rge r =
26 -- rlt and rge are in reverse order and must be sorted with an
27 -- anti-stable sorting
28 rqsort le rlt (x:rqsort le rge r)
29 qpart le x (y:ys) rlt rge r =
31 qpart le x ys rlt (y:rge) r
33 qpart le x ys (y:rlt) rge r
35 -- rqsort is as qsort but anti-stable, i.e. reverses equal elements
38 rqsort le (x:xs) r = rqpart le x xs [] [] r
40 rqpart le x [] rle rgt r =
41 qsort le rle (x:qsort le rgt r)
42 rqpart le x (y:ys) rle rgt r =
44 rqpart le x ys (y:rle) rgt r
46 rqpart le x ys rle (y:rgt) r