OrdenaLista.lsp



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