Die Funktion extract scheint es nicht vorgefertigt zu geben.
Ich habe mir daher die Funktionsweise erraten, aber es werden einige Elemente der Liste vergessen.
Code: Alles auswählen
;; MERGE SORT
(define (merge-sort alon)
(local (
(define (extract alon left right)
(local (
(define (extract-accu alon accu position)
(cond
[(= position right) accu]
[(< position left) (extract-accu (rest alon) accu (add1 position))]
[else (extract-accu (rest alon) (cons (first alon) accu) (add1 position))])))
(extract-accu alon empty 0)))
(define (merge alon1 alon2)
(cond
[(null? alon1) alon2]
[(null? alon2) alon1]
[(< (first alon1) (first alon2))
(cons (first alon1)
(merge (rest alon1) alon2))]
[else (cons (first alon2)
(merge alon1 (rest alon2)))]))
(define (merge-step left right)
(cond
[(>= left right) alon]
[else
(local (
(define mid (floor (/ (+ left right) 2)))
(define left-list (merge-sort (extract alon left mid)))
(define right-list (merge-sort (extract alon (add1 mid) right))))
(merge left-list right-list))])))
(merge-step 1 (length alon))))
(define lst (build-list 10 (lambda(n) (random 1000))))
lst
(merge-sort lst)
Code: Alles auswählen
(list 459 946 872 715 256 410 339 344 296 70)
(list 296 339 715 946)
2, 4, 7 und 9. (Von 1 an gezählt)
Findet jemand den Fehler?