(define (ordena-lista l) (if (or (null? l) (null? (cdr l))) l (let ((p (car l))) (let ((clas (clasifica p l))) (append (ordena-lista (first clas)) (second clas) (ordena-lista (third clas))))))) (define (clasifica ref lista) (clasifica-aux () () () ref lista)) (define (clasifica-aux menores iguales mayores ref lista) (if (null? lista) (list menores iguales mayores) (let ((valor (car lista))) (cond ((< valor ref) (clasifica-aux (cons (car lista) menores) iguales mayores ref (cdr lista))) ((< ref valor) (clasifica-aux menores iguales (cons (car lista) mayores) ref (cdr lista))) (else (clasifica-aux menores (cons (car lista) iguales) mayores ref (cdr lista))))))) (define (lista long talla) ;; construye una lista de numeros en el intervalo [0,talla) de longitud long (if (= long 0) () (cons (random talla) (lista (- long 1) talla)))) (define l1 (lista 1000 1000000)) (time (ordena-lista l1) 9) (define l2 (lista 2000 1000000)) (time (ordena-lista l2) 9) (define l3 (lista 4000 1000000)) (time (ordena-lista l3) 9) (define l4 (lista 8000 1000000)) (time (ordena-lista l4) 9)