(define (ordena-lista l predicado funcion)
(if (or (null? l)
(null? (cdr l)))
l
(let ((p (car l)))
(let ((clas (clasifica p l predicado funcion)))
(append (ordena-lista (first clas) predicado funcion)
(second clas)
(ordena-lista (third clas) predicado funcion))))))
(define (clasifica ref lista predicado funcion)
(clasifica-aux () () () ref lista predicado funcion))
(define (clasifica-aux menores iguales mayores ref lista predicado funcion)
(if (null? lista)
(list menores iguales mayores)
(let ((valor1 (funcion (car lista)))
(valor2 (funcion ref)))
(cond ((predicado valor1 valor2)
(clasifica-aux (cons (car lista) menores) iguales mayores ref (cdr lista) predicado funcion))
((predicado valor2 valor1)
(clasifica-aux menores iguales (cons (car lista) mayores) ref (cdr lista) predicado funcion))
(else
(clasifica-aux menores (cons (car lista) iguales) mayores ref (cdr lista) predicado funcion))))))
(define (lista long talla) ;; construye una lista de longitud long de n?meros en el intervalo [0,talla)
(if (= long 0)
()
(cons (random talla) (lista (- long 1) talla))))