Вот моя попытка реализовать быструю сортировку:Как я могу исправить мою реализацию quicksort?
(define (sublist ls start stop middle)
(cond ((null? ls) ls)
((< middle start) (sublist (cdr ls) start stop (+ middle 1)))
((> middle stop) '())
(else
(cons (car ls) (sublist (cdr ls) start stop (+ middle 1))))))
(define (split5 ls)
(let ((len (length ls)))
(cond ((= len 0) (list ls ls))
((= len 1) (list ls '()))
(else
(list (sublist ls 1 (/ len 2) 1)
(sublist ls (+(/ len 2)1) len 1))))))
;this divides the sorted list into two sublists
(define (dividelist rel? ls)
(split5 (order rel? ls)))
(define (quicksort rel? ls)
(if (null? (cdr ls)) ls
(let ((pivot (list-ref (sort rel? ls) (round (/ (length (sort rel? ls)) 2))))
(left (car (dividelist rel? ls)))
(right (cdr (dividelist rel? ls))))
(join left pivot right))))
Я знаю, что эта реализация очень неэффективно, но я не могу придумать способ сделать это. Во всяком случае, это не работает.
When I input this:
(quicksort < '(9 3 -5 8 -7 2 9))
It gives me this:
(-7 -5 2 8 (8 9 9))
It should give me this:
(-7 -5 2 3 8 9 9)
Как это исправить?
EDIT
(define (join ls1 goo ls2)
(if (null? ls1) (cons goo ls2)
(if (null? ls2) (cons goo ls1)
(cons (car ls1) (join (cdr ls1) goo ls2)))))
Не следует '(справа (cdr (разделитель rel? ls)))) 'В конце quicksort используется' cadr' вместо 'cdr'? –
Где процедура 'order'? Надеюсь, это не процедура сортировки: P. Кроме того, где процедура 'join'? –
... yah order использует процедуру сортировки. Это плохо? – 2013-04-01 23:08:41