【发布时间】:2018-09-15 15:59:17
【问题描述】:
我对正确的 Lisp 还是很陌生,我正在尝试构建一个简单但至少有点高效的插入排序 - 我想在适当的位置切换元素,但仍然能够附加到我的容器然后。我采用了旧的 C++ 实现:
template<typename Iter>
void insertionSort(Iter begin, Iter end){
for (auto i = begin; i != end; ++i){
for (auto j = i; j != begin && *(std::prev(j)) > *(j); j--){
std::iter_swap(j, std::prev(j));
}
}
}
并创建了以下代码(考虑到 aref 和 rotatef 具有相当的复杂性),但它似乎对输入没有任何影响(UPD:现在它只是工作不正常),可能是什么我的解决方案有问题吗?我返回是为了测试,是否应该创建一个宏以避免传值?
(defparameter testa (make-array 4 :initial-contents '(2 3 1 5)))
(defun insertion-sort (vect)
(loop for i from 0 to (1- (length vect)) do
(loop for j from i downto 0
until (or (= (1- j) -1) (> (aref vect (1- j)) (aref vect j)))
do (rotatef (aref vect i) (aref vect (1- j))))
)
vect
)
(format t "~a~%" (insertion-sort testa))
UPD:根据@jkiiski 和@RainerJoswig 的cmets 更新了代码,输出仍然错误。
【问题讨论】:
-
带有两个
FOR子句的LOOP只是一个带有两个变量的循环,而不是像 C++ 版本那样的两个循环。 -
@jkiiski 我已经更新了代码,测试用例的输出还是错误的。
-
不要使用 EQ 来比较数字。使用 EQL 或 =。
-
(return-from insertion-sort vect)可以只替换为vect。 -
@RainerJoswig 输出仍然是错误的解决方案
标签: algorithm sorting lisp common-lisp insertion-sort