(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))))