好的,所以我试图列出一个列表并从最大到最小的排序。
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))))
这就是我可以编译的全部内容,我编写的所有其他代码都失败了。任何帮助解决这个问题都将非常感激。
答案 0 :(得分:3)
您应该仔细清楚地说明要用于生成排序列表的策略。是这样的吗?
这不是一种非常快速的排序方式,但它应该有效。代码的下一步是编写一个函数来获取列表的其余部分(最大值除外)(如果列表有重复,请注意正确处理它。)
一旦你写完了,你应该能够编写看起来或多或少的方案代码,就像上面的大纲一样。
答案 1 :(得分:2)
这是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)) #'<))))
答案 2 :(得分:1)
您需要决定使用什么来对列表进行排序。最近我一直在修改方案,通过SICP和“Schemer”系列工作,我发现在方案中实现冒泡排序,合并排序和快速排序非常容易。
答案 3 :(得分:1)
您没有指定您正在使用的实现。但它可以实现r6rs list-sort或srfi-95 sort或任何其他内置排序。查看您的实施文档。