首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带滤波器的快速排序方案

带滤波器的快速排序方案
EN

Stack Overflow用户
提问于 2015-11-05 09:27:25
回答 1查看 1.4K关注 0票数 1

我需要编写函数(快速排序pred lst) lst是要排序的数字列表pred是对列表进行排序的谓词,该谓词的签名是:(lambda (x )…)

代码语言:javascript
复制
- (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.

我从常规的快速排序开始:

代码语言:javascript
复制
(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做这个:

代码语言:javascript
复制
(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))

我得到了无限递归什么的。

你能帮我解决这个问题吗?谢谢!

EN

回答 1

Stack Overflow用户

发布于 2015-11-05 10:10:31

首先,您不需要助手函数quick-sort-help

由于您将助手函数应用于lst而不是cdr lst,所以它会无限地递归。在常规的快速排序中,有(filter (lambda (n) (< n (car lst)))(filter (lambda (n) (> n (car lst)))。但是,在带有谓词的例子中,如果谓词是(not (pred ...),那么(not (pred ...)将涵盖<=的情况,而不是<的情况,反之亦然。所以它被卡住了,因为列表中的第一个元素总是与它本身相等。

这里有一个正确的快速排序:

代码语言:javascript
复制
(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)))))))
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33540789

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档