簡體   English   中英

帶過濾器的方案快速分類

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM