【问题标题】:Sorting a list of sublists in scheme对方案中的子列表列表进行排序
【发布时间】:2014-03-17 00:20:51
【问题描述】:

方案中

我正在尝试编写一段代码来对子列表列表进行排序,使用每个子列表的 to 元素之间的差异。我的意思是:

即,

子列表列表:'('(ted 10 4) '(barbie 10 5) '(car 10 7) '(ball 10 6))

我想根据每个子列表的第二个和第三个元素之间的差异对列表进行排序,因此排序后的列表应该看起来像升序(从低到高):

'('(汽车 10 7) '(球 10 6) '(芭比娃娃 10 5) '(泰迪 10 4))

我已经为子列表创建了访问器:

(define (access-name x) (car x))
(define (access-aquprice x)(cadr x))
(define (access-saleprice x)(caddr x))

排序循环让我很困惑,请帮忙! :)

到目前为止,我只有:

(define (sortlist curr) 
  (if (null? curr)
      (curr) 
      (if (> 
           (diff (access-aquprice (car toylist))  (access-saleprice (car toylist))) 
           (diff (access-aquprice (cadr toylist)) (access-saleprice (cadr toylist))))
          ("hello") 
          "goodbye")))

【问题讨论】:

  • 您可以使用内置的sort 过程还是应该从头开始实现它?
  • 我必须从头开始
  • 我需要创建一个新的排序列表。到目前为止,我只有:(define (sortlist curr) (if (null? curr)(curr) (if (> (diff (access-aquprice (car toylist))(access-saleprice (car toylist))) (diff (access-aquprice (cadr toylist)) (access-saleprice (cadr toylist)))) ("hello") "goodbye") ) )
  • 在没有先验知识的情况下从头开始编写排序算法并不是那么简单,特别是如果您刚刚开始学习基础知识。最好阅读一些关于排序算法的内容。恕我直言,快速排序或合并排序在 Scheme 中很容易实现,请以研究它们为起点。

标签: list sorting loops recursion scheme


【解决方案1】:

免责声明:这是我自己写的第一篇文章。它可能不是没有错误的

所以你首先要写一个基本的排序。我建议您查看this page 并选择一个。我选择了Merge sort,因为维基百科的插图很好,而且很容易递归实现。

我们将从排序一个简单的列表开始。

所以,首先要合并:

(define (merge lst1 lst2)
  (cond 
    ((null? lst1) lst2)
    ((null? lst2) lst1)
    ((> (car lst1) (car lst2)) 
     (cons (car lst2) (merge lst1 (cdr lst2))))
    (else
     (cons (car lst1) (merge (cdr lst1) lst2)))))

然后是归并排序:

(define (merge-sort lst)
  (define len (length lst))
  (if (<= len 1)
      lst
      (let ((n (quotient len 2)))
        (merge (merge-sort (take lst n)) (merge-sort (drop lst n))))))

(如果需要,takedropSRFI-1 中定义)

尝试:

> (merge-sort '(7 3 0 1 5 8))
'(0 1 3 5 7 8)
> (merge-sort '())
'()
> (merge-sort '(3 14 15 9 26 53 58 97 23))
'(3 9 14 15 23 26 53 58 97)

看起来不错。

现在我们将扩展它以使用自定义比较功能:

(define (merge-sort compare lst)

  (define (merge lst1 lst2)
    (cond 
      ((null? lst1) lst2)
      ((null? lst2) lst1)
      ((compare (car lst1) (car lst2)) 
       (cons (car lst2) (merge lst1 (cdr lst2))))
      (else
       (cons (car lst1) (merge (cdr lst1) lst2)))))

  (define (inner-sort lst)
    (define len (length lst))
    (if (<= len 1)
        lst
        (let ((n (quotient len 2)))
          (merge (inner-sort (take lst n)) (inner-sort (drop lst n))))))

  (inner-sort lst))

然后

> (merge-sort > '(7 3 0 1 5 8))
'(0 1 3 5 7 8)
> (merge-sort < '(7 3 0 1 5 8))
'(8 7 5 3 1 0)

最后,为您的案例创建一个自定义比较函数:

(merge-sort 
 (lambda (a b) (> (- (access-aquprice a) (access-saleprice a))
                  (- (access-aquprice b) (access-saleprice b))))
 '((ted 10 4) (barbie 10 5) (car 10 7) (ball 10 6)))

产量

'((car 10 7) (ball 10 6) (barbie 10 5) (ted 10 4))

【讨论】:

    【解决方案2】:

    我知道这个问题已经 3 年了,你不能使用内置的 sort 函数,但以防万一有人需要它:

    (sort (lambda (x y) (< (- (cadr x) (caddr x))
                           (- (cadr y) (caddr y))))
          '((ted 10 4) (barbie 10 5) (car 10 7) (ball 10 6)))
    

    返回((car 10 7) (ball 10 6) (barbie 10 5) (ted 10 4))

    干杯!
    安德烈斯

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多