找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1432|回复: 13

[求助] [求助]:请问有没有对数据列表排序的函数?

[复制链接]
发表于 2007-1-26 23:14:57 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
比如列表(22 55 33 66 11 44  )从小到大排序后成为(11 22 33 44 55 66)?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2007-1-27 02:03:35 | 显示全部楼层
[php]
(defun listremoveatom (delatom lstin)
  (apply
    'append
    (subst
      nil
      (list delatom)
      (mapcar
    'list
    lstin
      )
    )
  )
)
(defun sortlst(lst / len k abc lst_sort)
  (setq len (length lst))
  (setq k 1)
  (while (<= k len)
    (setq abc (eval (append '(max) lst)))
    (setq lst (listremoveatom abc lst))
    (setq lst_sort (cons abc lst_sort))
    (setq k (1+ k))
  )
  (reverse lst_sort)
)
[/php]
运行:
  (setq lst '(55 11 33 44 22 66))
  (reverse (sortlst lst))
结果:
(11 22 33 44 55 66)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 2个

财富等级: 恭喜发财

发表于 2007-1-27 08:22:25 | 显示全部楼层
何必亲自动手?使用vl-sort函数即可。
[PHP]
(setq list '(55 11 33 44 22 66))
(vl-sort list '<  )
[/PHP]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 2个

财富等级: 恭喜发财

发表于 2007-1-27 08:48:03 | 显示全部楼层

  1.   [FONT=courier new]
  2. STDLIB裏最全面了.
  3. Synopsis
  4. (std-sort <lst> <less-pred>)
  5. (std-stable-sort <lst> <less-pred>) ; keeps order intact
  6. (std-fast-sort <lst> <less-pred>) ; may remove duplicates
  7. Description
  8. All return a sorted list, sort order determined by the less predicate. Increasing numbers should be sorted with <

  9. Most of the time you may use STD-FAST-SORT, if you accept the restrictions.

  10. STD-SORT may be slower than STD-FAST-SORT but keeps all elements of the list. Duplicates are not removed.

  11. STD-STABLE-SORT maybe slower than STD-SORT and STD-FAST-SORT but keeps the elements in its original order. Only on VILL and VLISP it is different from std-sort, which is the same as STD-FAST-SORT.

  12. STD-FAST-SORT may remove duplicate entries. (implementation dependent). To keep all elements use STD-SORT instead. This was introduced with VLX-SORT and VL-SORT. On VILL and VLISP this is the same as STD-SORT.

  13. All the functions besides the internal VL[X]-SORT use a stable and iterative merge-sort algorithm, which is equally fast for ordered or random lists and has no stack overflow problems.

  14. So STD-STABLE-SORT is for now the same as std-sort, until a faster but not stable sort algorithm is found. In plain AutoLISP even all three of them are the same.

  15. Examples
  16. (std-fast-sort '(2 0 1 2 3 4 0) '<)
  17. => (0 1 2 3 4)
  18. or (0 0 1 2 2 3 4)

  19. (std-stable-sort '(2 0 1 2 3 4 0) '<)      => (0 0 1 2 2 3 4)
  20. (std-fast-sort '("2" "1" "3" "4" "0") '<)  => ("0" "1" "2" "3" "4")
  21. (std-sort pointlist '(lambda (x y) (< (car x) (car y))))
  22. => pointlist sorted according increasing x-value

  23. Arguments
  24. lst: any proper list

  25. less-pred: a function or lambda list accepting 2 arguments, and returning nil if the second argument is lower or equal than the first. For numbers and strings use '<.

  26. Return Value
  27. A sorted list. STD-SORT and STD-STABLE SORT return a list of the same length as the argument.

  28. Side Effects
  29. Not confirmed yet: STD-FAST-SORT is the only function which might destructivly change the original list (in Vital Lisp or Visual Lisp). So if you want to keep the original list intact, use a copy of the list, use STD-COPY-TREE, just for safety reasons.

  30. The predicate also might produce side-effects, but this is generally not a good idea!


  31.   [/FONT]
复制代码
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 7196个

财富等级: 富甲天下

发表于 2007-1-27 09:54:08 | 显示全部楼层
验证 VL-SORT
Command: (vl-sort lst '<  )
(11 22 33 44 55 66)

Command: (setq lst '(55 11 33 66 44 22 66 55 44))
(55 11 33 66 44 22 66 55 44)

Command: (vl-sort lst '<  )
(11 22 33 44 55 66)     ; may remove duplicates
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2007-1-27 12:23:31 | 显示全部楼层
我那个也不行。不能有两个相同的数字在里面。。
还得改进。。。喜欢用R14,所以。。坚持不用VL的函数语言。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-1-27 13:15:52 | 显示全部楼层
就看大家要用于什么目的,我要的是找出一个数据列表里面的一个最小值或最大值,因此zm184的方法对于我的要求最简洁,欣然采纳之。而其他各位朋友的方法也都很不错,收藏起来慢慢消化。谢谢各位!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 2个

财富等级: 恭喜发财

发表于 2007-1-27 15:36:39 | 显示全部楼层

  1.   [FONT=courier new]
  2. ;;; ==================================================================
  3. (defun std-count (ele lst / i)
  4.   (setq i 0)
  5.   (foreach x lst
  6.     (if (= ele x)
  7.       (setq i (1+ i))
  8.     )
  9.   )
  10.   i
  11. )
  12. ;;; (std-count x lst) 返回元素x在表lst中的个数
  13. ;;; ==================================================================
  14. (defun std-remove-duplicates (lst / ele new)
  15.   (setq new nil)
  16.   (foreach ele lst
  17.     (if (not (member ele new))
  18.       (setq new (cons ele new))
  19.     )
  20.   )
  21.   (reverse new)
  22. )
  23. ;;; (std-remove-duplicates lst) 删除重复元素,排序不破坏。
  24. ;;; ==================================================================
  25. (defun th-list-addnth (lst pos val / lst1 lst2 cnt nverts)
  26.   (setq cnt 0
  27.         lst1 '()
  28.         nverts (length lst)
  29.   )
  30.   (repeat pos
  31.     (setq lst1 (cons (nth cnt lst) lst1)
  32.           cnt (1+ cnt)
  33.     )
  34.   )
  35.   (setq lst1 (cons val lst1)
  36.         lst1 (reverse lst1)
  37.         cnt pos
  38.   )
  39.   (if (> nverts pos)
  40.     (progn
  41.       (setq lst2 '())
  42.       (repeat (- nverts pos)
  43.         (setq lst2 (cons (nth cnt lst) lst2)
  44.               cnt (1+ cnt)
  45.         )
  46.       )
  47.       (setq lst2 (reverse lst2)
  48.             lst1 (append
  49.                    lst1
  50.                    lst2
  51.                  )
  52.       )
  53.     )
  54.   )
  55.   lst1
  56. )
  57. ;;; (th-list-addnth 表 位置 新元素). 在表的第n項位置增增加一元素

  58. ;;; ==================================================================
  59. (defun th-sort< (lst / lst1 len lst2 i n)
  60.   (setq lst1 (std-remove-duplicates lst))
  61.   (setq lst2 (vl-sort lst1 '<))
  62.   (setq len (length lst))
  63.   (setq i 0)
  64.   (while (< i len)
  65.     (if (> (setq n (std-count (setq el (nth i lst2))
  66.                               lst
  67.                    )
  68.            )
  69.            1
  70.         )
  71.       (repeat (1- n)
  72.         (setq lst2 (th-list-addnth lst2 i el))
  73.       )
  74.     )
  75.     (setq i (+ n i))
  76.   )
  77.   lst2
  78. )
  79. ;;; ==================================================================
  80. (defun th-sort> (lst / lst1 len lst2 i n)
  81.   (setq lst1 (std-remove-duplicates lst))
  82.   (setq lst2 (vl-sort lst1 '>))
  83.   (setq len (length lst))
  84.   (setq i 0)
  85.   (while (< i len)
  86.     (if (> (setq n (std-count (setq el (nth i lst2))
  87.                               lst
  88.                    )
  89.            )
  90.            1
  91.         )
  92.       (repeat (1- n)
  93.         (setq lst2 (th-list-addnth lst2 i el))
  94.       )
  95.     )
  96.     (setq i (+ n i))
  97.   )
  98.   lst2
  99. )
  100. ;;; ==================================================================
  101. ;;;測試:
  102. ;;;命令: !a (4 6 7 9 3 0 4 3 2 3 5 55 66 99 55 77 0 3 6 4 2 1)

  103. ;;;命令: (th-sort< a)
  104. ;;;(0 0 1 2 2 3 3 3 3 4 4 4 5 6 6 7 9 55 55 66 77 99)

  105. ;;;命令: (th-sort> a)
  106. ;;;(99 77 66 55 55 9 7 6 6 5 4 4 4 3 3 3 3 2 2 1 0 0)
  107.   [/FONT]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2007-1-27 17:25:48 | 显示全部楼层
修改了一下。把原来相同的数字也考虑进去的排序:
[php]
(defun LI_DelLst (Idx Lst / nlst cnt elem)
  (setq
    nlst '()
    cnt         1
  )
  (foreach elem        lst
    (if        (/= cnt Idx)
      (setq nlst (cons elem nlst))
    )
    (setq cnt (1+ cnt))
  )
  (reverse nlst)
)

(defun sortlist (lis / len k abc nn len_nn plis)
  (setq len (length lis))
  (setq k 1)
  (while (<= k len)
    (setq abc (eval (append '(max) lis)))
    (setq nn 1)
    (setq len_nn (length lis))
    (while (<= nn len_nn)
      (if (= (nth (1- nn) lis) abc)
        (progn
          (setq lis (LI_DelLst nn lis))
          (setq plis (cons abc plis))
        )
      )
      (setq nn (1+ nn))
    )
    (setq k (1+ k))
  )
  (reverse plis)
)
[/php]
运行:
(sortlist '(11 55 44 66 33 22 66 55))
结果:
(66 66 55 55 44 33 22 11)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 2个

财富等级: 恭喜发财

发表于 2007-1-28 10:51:32 | 显示全部楼层
最初由 carrot1983 发布
[B]修改了一下。把原来相同的数字也考虑进去的排序:
[php]
(defun LI_DelLst (Idx Lst / nlst cnt elem)
  (setq
    nlst '()
    cnt         1
  )
  (foreach elem        lst
    (if        (/= cnt Idx)
      (setq nlst (... [/B]

再作一點小的改動.

  1.   [FONT=courier new]
  2. ;;;刪除表中第n個元素,從0開始計數
  3. (defun li_dellst (idx lst / nlst cnt elem)
  4.   (setq nlst '()
  5.         cnt 0
  6.   )
  7.   (foreach elem lst
  8.     (if (/= cnt idx)
  9.       (setq nlst (cons elem nlst))
  10.     )
  11.     (setq cnt (1+ cnt))
  12.   )
  13.   (reverse nlst)
  14. )
  15. (defun sortlist> (lis / len k abc n len_n plis)
  16.   (setq len (length lis))
  17.   (setq k 0)
  18.   (while (< k len)
  19.     (setq abc (apply
  20.                 'max
  21.                 lis
  22.               )
  23.     )
  24.     (setq n 0)
  25.     (setq len_n (length lis))
  26.     (while (< n len_n)
  27.       (if (= (nth n lis) abc)
  28.         (progn
  29.           (setq lis (li_dellst n lis))
  30.           (setq plis (cons abc plis))
  31.         )
  32.       )
  33.       (setq n (1+ n))
  34.     )
  35.     (setq k (1+ k))
  36.   )
  37.   (reverse plis)
  38. )
  39. (defun sortlist< (lis / len k abc n len_n plis)
  40.   (setq len (length lis))
  41.   (setq k 0)
  42.   (while (< k len)
  43.     (setq abc (apply
  44.                 'min
  45.                 lis
  46.               )
  47.     )
  48.     (setq n 0)
  49.     (setq len_n (length lis))
  50.     (while (< n len_n)
  51.       (if (= (nth n lis) abc)
  52.         (progn
  53.           (setq lis (li_dellst n lis))
  54.           (setq plis (cons abc plis))
  55.         )
  56.       )
  57.       (setq n (1+ n))
  58.     )
  59.     (setq k (1+ k))
  60.   )
  61.   (reverse plis)
  62. )
  63. ;;;命令: !a
  64. ;;;(4 6 7 9 3 0 4 3 2 3 5 55 66 99 55 77 0 3 6 4 2 1)

  65. ;;;命令: (sortlist> a)
  66. ;;;(99 77 66 55 55 9 7 6 6 5 4 4 4 3 3 3 3 2 2 1 0 0)

  67. ;;;命令: (sortlist< a)
  68. ;;;(0 0 1 2 2 3 3 3 3 4 4 4 5 6 6 7 9 55 55 66 77 99)

  69.   [/FONT]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2007-1-29 01:24:04 | 显示全部楼层
运行:
(sortlist '(11 55 44 66 33 22 66 55))
结果:
(66 66 55 55 44 33 22 11)


;;
(defun tt (lst)
  (mapcar '(lambda(x)(nth x lst))(vl-sort-i lst '>))
)
(tt '(11 55 44 66 33 22 66 55)) ->(66 66 55 55 44 33 22 11)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 2个

财富等级: 恭喜发财

发表于 2007-1-29 07:56:23 | 显示全部楼层
還是VLISP強!要好好學習VLISP啊!不過,在用純LISP達到這些功能時,對我們菜鳥學習編程還是蠻有幫助的.
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 2个

财富等级: 恭喜发财

发表于 2007-1-29 08:39:00 | 显示全部楼层
最初由 mhy007 发布
[B]就看大家要用于什么目的,我要的是找出一个数据列表里面的一个最小值或最大值,因此zm184的方法对于我的要求最简洁,欣然采纳之。而其他各位朋友的方法也都很不错,收藏起来慢慢消化。谢谢各位! [/B]

<br>
若是需求是找最大值、最小值的话,则不必先对表进行排序操作。
直接调用max、min两各函数即可。实例如下:
[PHP]
(setq a        '(11 55 44 66 33 22 66 55)
      b        (apply 'max a)
      c        (apply 'min a)
)
[/PHP]
另:对于vLISP的态度,亦不必一味    或依赖。
能以纯ALISP从底层实现是好的,但使用vLISP提供的函数也未尝不可。
因为LISP语言的精髓便是函数调用和递归。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 22个

财富等级: 恭喜发财

发表于 2020-1-9 15:47:12 | 显示全部楼层
学习学习学习学习学习学习学习学习学习学习学习学习学习学习学习学习学习学习学习学习学习学习学习学习学习学习学习学习学习学习
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-11-6 03:40 , Processed in 0.371162 second(s), 57 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表