I am learning haskell and the function definition I see is:
quickSort (x : xs) = (quickSort less) ++ (x : equal) ++ (quickSort more)
where less = filter (< x) xs
equal = filter (== x) xs
more = filter (> x) xs
Is it possible to write it with only one traversal of the list, instead of 3?
You mean something like this?
quicksort [] = []
quicksort (x:xs) = quicksort less ++ (x : equal) ++ quicksort more
where (less, equal, more) = partition3 x xs
partition3 _ [] = ([], [], [])
partition3 x (y:ys) =
case compare y x of
LT -> (y:less, equal, more)
EQ -> (less, y:equal, more)
GT -> (less, equal, y:more)
where (less, equal, more) = partition3 x ys
Note that this isn't really quicksort, as the real quicksort is in-place.
It does not seem to improve anything but:
qs (x:xs) = let (a,b) = partition (< x) xs in (qs a) ++ [x] ++ (qs b)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With