Sorting 带过滤器的快速排序方案
我需要编写函数(快速排序pred lst) lst是要排序的数字列表 pred是列表排序的谓词,该谓词的签名是:(lambda(x y)…) 我得到了一个无限递归或者其他的东西 你能帮我解决这个问题吗?Sorting 带过滤器的快速排序方案,sorting,recursion,scheme,racket,quicksort,Sorting,Recursion,Scheme,Racket,Quicksort,我需要编写函数(快速排序pred lst) lst是要排序的数字列表 pred是列表排序的谓词,该谓词的签名是:(lambda(x y)…) 我得到了一个无限递归或者其他的东西 你能帮我解决这个问题吗? 谢谢 首先,您不需要助手功能快速排序帮助 它无限递归,因为您将助手函数应用于lst,而不是cdrlst。在常规的快速排序中,您有(filter(lambda(n)(n(car lst)))。但是在使用谓词的快速排序中,您有一个问题,(not(pred…)将涵盖的情况,非常感谢!但是当我尝试将其
谢谢 首先,您不需要助手功能
快速排序帮助
它无限递归,因为您将助手函数应用于
lst
,而不是cdrlst
。在常规的快速排序中,您有(filter(lambda(n)(
和(filter(lambda(n)(>n(car lst)))
。但是在使用谓词的快速排序中,您有一个问题,(not(pred…
)将涵盖的情况,非常感谢!但是当我尝试将其用于:(qsort(lambda(xy)(<(car x)时)(car y)))lst)它不起作用……你知道为什么吗?(它假设根据内部列表的第一个元素对具有内部列表的列表进行升序排序。如果内部列表为空,它就不起作用,但是(qsort(lambda(x y)(<(car x)(car y))”((72)(36)(53))
生成(列表(36)(列表5 3)(列表7 2))
。这不是你想要的吗?
- (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))))))
(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))
(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)))))))