[英]Scheme quick-sort with filter
我需要編寫函數(quick-sort pred lst) lst是要排序的數字列表pred是列表被排序的謂詞,該謂詞的簽名是: (lambda(xy)…)
- (quick-sort < lst) will sort ascending (small to large)
- (quick-sort > lst) will sort descending (large to small)
- (quick-sort (lambda (x y) (< (car x) (car y))) lst) will sort a list
with inner lists according to the first element of the inner list, ascending.
我從常規快速排序開始:
(define (quick-sort lst)
(cond
((null? lst) '())
((= (length lst) 1) lst)
(else (append (quick-sort (filter (lambda (n) (< n (car lst))) lst))
(list (car lst))
(quick-sort (filter (lambda (n) (> n (car lst))) lst))))))
現在,我嘗試使用pred做到這一點:
(define (quick-sort pred lst)
(define (quick-sort-help lst)
(cond ((null? lst) ())
((= (length lst) 1) lst)
(else
(append (quick-sort-help (filter (lambda (n) (pred n (car lst))) lst))
(list (car lst))
(quick-sort-help (filter (lambda (n) (not(pred n (car lst)))) lst)))))) (quick-sort-help lst))
而且我得到無限遞歸之類的東西。
您能幫我解決這個問題嗎? 謝謝!
首先,您不需要helper函數quick-sort-help
。
它無限重復發生,因為您將輔助函數應用於lst
而不是cdr lst
。 在您的常規quicksort中,您有(filter (lambda (n) (< n (car lst)))
和(filter (lambda (n) (> n (car lst)))
。但是在帶有謂詞的那一個中問題(not (pred ...)
會涵蓋<=
而不是<
如果謂詞為>
,反之亦然。)之所以陷入困境,是因為列表中的第一個元素始終與自身相等。
這里是正確的快速排序:
(define (qsort f lst)
(if (null? lst)
null
(let ([pivot (car lst)])
(append (qsort f (filter (λ (n) (f n pivot)) (cdr lst)))
(list pivot)
(qsort f (filter (λ (n) (not (f n pivot))) (cdr lst)))))))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.