クイックソートのアルゴリズムは、

  • 適当な数(ピボットという)を選択する (この場合はデータの総数の中央値が望ましい)
  • ピボットより小さい数を前方、大きい数を後方に移動させる (分割)
  • 二分割された各々のデータを、それぞれソートする

(引用元 : Wikipedia)

ピボットとして、リストの先頭の値を用いることにすれば、
クイックソート(降順)は下記のように書ける:

decreasingOrder :: Ord a => [a] -> [a]
decreasingOrder [] = []
decreasingOrder (x:xs) = decreasingOrder ys ++ [x] ++ decreasingOrder zs
	where
		ys = [a | a <- xs, a > x]
		zs = [b | b <- xs, b <= x]

昇順は、

ascendingOrder :: Ord a => [a] -> [a]
ascendingOrder [] = []
ascendingOrder (x:xs) = ascendingOrder ys ++ [x] ++ ascendingOrder zs
	where
		ys = [a | a <- xs, a <= x]
		zs = [b | b <- xs, b > x]