【问题标题】:Sorting in Clisp在 Clip 中排序
【发布时间】:2012-03-10 23:52:38
【问题描述】:

我想在 clisp 中编写插入排序和合并排序。输入将是一个平面的数字列表。如何递归地编写这两种类型(最好不使用 lambda)?对于插入排序,我正在考虑创建一个函数,该函数将列表和整数(意味着感兴趣的元素的当前索引)作为参数,并使用 setf 和 nth 来操作列表。我知道其中还应该有另一个递归函数,但就像......我只是对这么多要存储的函数和变量感到困惑。

对于归并排序我完全不知道。

【问题讨论】:

    标签: sorting mergesort insertion-sort clisp


    【解决方案1】:

    归并排序是自然递归的(任何分而治之的问题也是如此)

    http://en.literateprograms.org/Merge_sort_(Lisp)

    他们引用的插入排序实现有点反功能

    http://en.literateprograms.org/Insertion_sort_(Lisp)

    但是循环可以很容易地变成尾递归。

    【讨论】:

    • 并不是说 Common Lisp 保证是尾递归的,但大多数实现都将其作为实现细节。
    • 合并看起来没问题,但插入有点……疯狂。这正是我来到这里的原因——我不知道循环语法或“finally”、“aref”、“1+/1-”或“flet”是什么。
    【解决方案2】:

    我看到这是一个老问题,但我也很想知道如何以 Common Lisp 风格编写 Mergesort 的递归实现,所以我是这样写的:

    (defun mergesort (lo hi)
      (let ((mid 0)
      (items 0))
    
      ;; initializations
      (setq items (- hi lo))
      (multiple-value-bind (intreg rest)
      (floor (/ (+ hi (1+ lo)) 2))
        (setq mid intreg))
    
      ;; recursive call if more than 1 item
      (cond ((> items 1)
        (mergesort lo mid)
        (mergesort mid hi)))
    
      ;; merge step
      (let ((temp (sort-range *unsorted-list* lo mid hi)))
      (do ((x lo (1+ x))
       (tx 0 (1+ tx)))
      ((= x hi))
    (setf (nth x *unsorted-list*) (nth tx temp))))
    ))
    
    ;; collect and sort range between low and high
    (defun sort-range (LIST lo mid hi)
      (labels ((collect-range (i1 i2)
         (if (and (< i1 mid) (< i2 hi))
         (let ((lv (nth i1 LIST))
               (rv (nth i2 LIST)))
    
           (if(and (< lv rv) (< i1 mid))
              (cons lv (collect-range (1+ i1) i2))
              (if(<= i2 hi)
             (cons rv (collect-range i1 (1+ i2))))
              ))
         (if (< i1 mid)
             (cons (nth i1 LIST) (collect-range (1+ i1) i2))
             (if(< i2 hi)
            (cons (nth i2 LIST) (collect-range i1 (1+ i2)))))
         )))
    (collect-range lo mid)))
    

    欢迎提出任何建议!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-10-19
      • 2014-07-07
      • 1970-01-01
      • 2020-08-28
      • 2016-03-26
      • 2015-04-19
      • 2012-03-10
      相关资源
      最近更新 更多