let rec quick_sort lst = let rec filter f n lst = match lst with [] -> [] | first :: rest -> if f first n then first :: filter f n rest else filter f n rest in match lst with [] -> [] | first :: rest -> quick_sort (filter (<) first rest) @ [first] @ quick_sort (filter (>) first rest)