2010-03-26 40 views
0

好的,我试图列入清单并从最大到最小排序。计划整理清单

Example: 
> (maxheap (list 5 6 2 1 18 7)) 
;output: 
> (18 7 6 5 2 1) 

因此,这里是我走到这一步:

(define (mkmaxheap heaplist) 
    (let ((max (mymax(heaplist)))) 
    ;mymax is a func that returns max number, it works 

    (let ((head (car heaplist)) (tail (cdr heaplist))) 
     (if (null? tail) 
     newlist)))) 

这就是所有我能得到编译,其他所有的代码我写失败。任何帮助解决这个将不胜感激。

回答

2

你应该清楚地说明你想用来生成排序列表的策略。是这样的吗?

  • 查找列表中的最大数量。
  • 获取列表中除最大值以外的其余部分。
  • 对列表的其余部分进行排序,并将最大值放在它的前面。

这不是一个非常快速的方法来排序,但它应该工作。代码的下一步是编写一个函数来获取除最大值之外的其他列表(如果列表中有重复项,请正确处理它)。

一旦写完了,应该是能够写出与上述轮廓类似或多或少的Scheme代码。

1

这是Common lisp中的合并排序算法。这大致接近于在计划中实施相同的排序。

(defun merge-sort(input) 
    (labels ((right-half (input) 
      (last input (ceiling (/ (length input) 2)))) 
      (left-half (input) 
      (ldiff input (right-half input)))) 
    (if (or (null input) (null (cdr input))) 
     input 
     (merge 'list (merge-sort (left-half input)) (merge-sort (right-half input)) #'<)))) 
1

您需要决定如何使用排序列表。最近我一直在对方案进行修改,通过SICP和“Schemer”系列工作,我发现在方案中实现泡泡排序,合并排序和快速排序非常简单。

1

你没有指定你正在使用的实现。但它可以执行r6rs list-sortsrfi-95 sort或任何其他内置排序。查看你的实现文档。