首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >插入排序到位LISP

插入排序到位LISP
EN

Stack Overflow用户
提问于 2018-09-15 15:59:17
回答 1查看 282关注 0票数 2

对于适当的Lisp,我还是很新的,我正在尝试构建一个简单的插入排序,但至少有点高效率的插入排序--我想切换元素,但仍然能够在以后添加到我的容器。我采用了我以前的C++实现:

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

并创建了以下代码(考虑到arefrotatef具有相当的复杂性),但是它似乎对输入没有任何影响(UPD:现在它只是不正确地工作),我的解决方案可能有什么问题?我返回是为了测试目的,我应该创建一个宏以避免按值传递吗?

代码语言:javascript
复制
(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的注释更新了代码,输出仍然是错误的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-09-15 18:54:35

在您的程序中有几个问题。

首先,排序不起作用,因为行:

代码语言:javascript
复制
do (rotatef (aref vect i) (aref vect (1- j))))

应:

代码语言:javascript
复制
do (rotatef (aref vect j) (aref vect (1- j))))

也就是说,您已经编写了变量i而不是j

如果您进行此更正,您将发现订单正在减少(我假设您想要一个增加的订单)。这取决于使用until而不是while

最后,还有多余的代码。一个更简单、更有效的版本如下:

代码语言:javascript
复制
(defparameter testa (make-array 4 :initial-contents '(2 3 1 5)))
(defun insertion-sort (vect)
   (loop for i from 1 below (length vect) 
     do (loop for j from i above 0
          while (> (aref vect (1- j)) (aref vect j))
          do (rotatef (aref vect j) (aref vect (1- j)))))
   vect)
(format t "~a~%" (insertion-sort testa))

这与Insertion sort维基百科页面中的伪代码并行.

如果您想参数化排序谓词,并向函数添加一个可选的基于关键字的“key”参数,下面是一个可能的解决方案:

代码语言:javascript
复制
(defun insertion-sort (vect predicate &key (key #'identity))
  (loop for i from 1 below (length vect) 
        do (loop for j from i above 0
                 while (funcall predicate 
                                (funcall key (aref vect (1- j)))
                                (funcall key (aref vect j)))
                 do (rotatef (aref vect j) (aref vect (1- j)))))
         vect)

CL-USER> (insertion-sort testa #'>)
#(1 2 3 5)
CL-USER> (insertion-sort testa #'<)
#(5 3 2 1)

CL-USER> (defparameter testa (make-array 4 :initial-contents '((c 3) (d 2) (b 1) (a 4))))
TESTA
CL-USER> (insertion-sort testa #'string> :key #'car)
#((A 4) (B 1) (C 3) (D 2))
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52346386

复制
相关文章

相似问题

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