Código: Seleccionar todo
qs :: Ord a => [a] -> [a]
qs [] = []
qs xs = qs[q | q <- init xs,not (q >= last xs)]++[last xs]++qs[q | q <- init xs, not (q < last xs)]
[Enlace externo eliminado para invitados]
Muestra:
Código: Seleccionar todo
"ghci>" :load "QuickSort.hs"
[1 of 1] Compiling Main ( QuickSort.hs, interpreted )
Ok, modules loaded: Main.
"ghci>" qs [95,14,72,10,63,44,69,28]
[10,14,28,44,63,69,72,95]
"ghci>" qs "DFBEAC"
"ABCDEF"
"ghci>"
en los codigos que hay por internet suelen tomar el primer elemento de la lista como pivote, yo tomo en este codigo el ultimo elemento de la lista como pivote y hago una comparacion inversa con not en el predicado para asi hacer el quicksort mas alternativo o inverso ya que esa era mi intencion, que el codigo trabaje de manera inversa deacuerdo a los codes que se ven por hay que lo hacen tomando como pivote el primer elemento de la lista para despues hacer una comparacion no inversa, Despues uso init para ir deconstruyendo la lista y asi dar con el caso base de la funcion que es la lista vacia(fin de la recursion), en los otros codigos no inversos usan un ajuste de patrones para ir deconstruyendo la lista
espero les haya quedado clara la explicacion xD, un saludo a todos