;; Ces programmes sont sous licence CeCILL-B V1. ;; Exécution en ligne de commande avec Bigloo : ;; $ bigloo -i TriFusion.scm (define nbItems 16) (define items (make-vector nbItems 0)) ;; initialisation du tableau avec des nombres aléatoires (define (RandomInitialise items) (let ((nbItems (vector-length items))) (do ((item 0 (+ item 1))) ((= item nbItems)) (vector-set! items item (random 1000))))) ;; affichage du tableau avant tri (define (AfficheTableau items) (let ((nbItems (vector-length items))) (do ((item 0 (+ item 1))) ((= item nbItems)) (display (vector-ref items item)) (display " ")) (newline))) (define (fusion items debut milieu fin) (let* ((nbItems (vector-length items)) (item1 debut) (item2 milieu) (temp (make-vector nbItems 0))) (do ((item debut (+ item 1))) ((= item fin)) (if (or (= item2 fin) (and (< item1 milieu) (< (vector-ref items item1) (vector-ref items item2)))) (begin (vector-set! temp item (vector-ref items item1)) (set! item1 (+ item1 1))) (begin (vector-set! temp item (vector-ref items item2)) (set! item2 (+ item2 1))))) (do ((item debut (+ item 1))) ((= item fin)) (vector-set! items item (vector-ref temp item))))) (define (triFusion items debut fin) (if (> (- fin debut) 1) (let ((milieu (quotient (+ debut fin) 2))) (triFusion items debut milieu) (triFusion items milieu fin) (fusion items debut milieu fin)))) (RandomInitialise items) (AfficheTableau items) (triFusion items 0 (vector-length items)) (AfficheTableau items)