找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1322|回复: 6

[讨论]:再探数组排序

[复制链接]
发表于 2004-2-5 18:03:45 | 显示全部楼层 |阅读模式

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

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

×
以下是秋风版主的程序,对点先x后y后z从小到大排序
我提出的问题是:以下程序只能对3维的数组有效,如果数组内元素个数不定,如何写一个通用的程序来进行排序?
如:((n个元素)(n个元素)(n个元素)。。。)

  1. Sort_and_Write_pList :见附件
  2. (defun Sort_and_Write_pList (fname plist / fp pt)
  3.   ;; sort plist first
  4.   (setq plist (vl-sort plist
  5.          '(lambda (p1 p2)
  6.      (cond ((< (car p1) (car p2)) T)
  7.     ((and (= (car p1) (car p2))
  8.           (< (cadr p1) (cadr p2))
  9.      )
  10.      T
  11.     )
  12.     ((and (= (car p1) (car p2))
  13.           (= (cadr p1) (cadr p2))
  14.           (< (caddr p1) (caddr p2))
  15.      )
  16.      T
  17.     )
  18.     (T nil)
  19.      )
  20.    )
  21.        )
  22.   )
  23.   ;; write plist then
  24.   (setq fp (open fname "w"))
  25.   (foreach pt plist (princ pt fp) (princ "\n" fp))
  26.   (close fp)
  27. )

  28. ;;; 测试上述函数
  29. (Sort_and_Write_pList
  30.   "c:/test.txt"
  31.   '((1 3 4)
  32.     (2 4 5)
  33.     (3 4 5)
  34.     (1 3 2)
  35.     (3 5 2)
  36.     (2 4 0)
  37.     (1 2 3)
  38.     (1 2 0)
  39.     (1 1 0)
  40.    )
  41. )
  42. 下载:

  43. 点击浏览该文件
  44. 运行结果:c:\test.txt中内容
  45. (1 1 0)
  46. (1 2 0)
  47. (1 2 3)
  48. (1 3 2)
  49. (1 3 4)
  50. (2 4 0)
  51. (2 4 5)
  52. (3 4 5)
  53. (3 5 2)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2004-2-6 23:17:25 | 显示全部楼层
有点意思,我也考虑考虑这个问题。
论坛的高手都去哪儿放风了?怎么没一个出来的?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 6530个

财富等级: 富甲天下

发表于 2004-2-7 16:14:39 | 显示全部楼层
发一帖,抛砖引玉,冒泡法。


  1. ;;比较两个数值表的大小,fun可以是“'<”(升序)或“'>”(降序)
  2. (defun comp_list (list1 list2 fun / sign i len1 len2 listt list_c list_a)
  3.   (setq        sign   nil
  4.         i      0
  5.         len1   (length list1)
  6.         len2   (length list2)
  7.         n      (eval (list 'min len1 len2))
  8.         list_a (list list1 list2)
  9.   )
  10.   (if (not (eval (list fun len1 len2)))
  11.     (setq listt        list1
  12.           list1        list2
  13.           list2        listt
  14.     )
  15.   )
  16.   (setq list_c (list list1 list2))
  17.   (while (and (not sign) (< i n))
  18.     (setq atom1        (nth i list1)
  19.           atom2        (nth i list2)
  20.     )
  21.     (if        (= atom1 atom2)
  22.       (setq i (1+ i))
  23.       (if (eval (list fun atom1 atom2))
  24.         (setq sign t)
  25.         (setq sign   t
  26.               list_c (list list2 list1)
  27.         )
  28.       )
  29.     )
  30.   )
  31. ;  (princ list_c)                ;返回排序后组合表
  32.   (if (equal list_c list_a)        ;返回是否符合函数fun
  33.     t
  34.     nil
  35.   )
  36. )

  37. ;;二阶数值表排序,fun可以是“'<”(升序)或“'>”(降序)
  38. (defun sort_list (nlist fun / len lista list_b list_o)
  39.   (setq        list_o nil
  40.         len    (length nlist)
  41.   )
  42.   (repeat len
  43.     (setq lista         (car nlist)
  44.           nlist         (cdr nlist)
  45.           list_b nil
  46.     )
  47.     (mapcar
  48.       '(lambda (x)
  49.          (if (comp_list lista x fun)
  50.            (setq list_b (cons x list_b))
  51.            (setq list_b        (cons lista list_b)
  52.                  lista        x
  53.            )
  54.          )
  55.        )
  56.       nlist
  57.     )
  58.     (setq nlist list_b)
  59.     (setq list_o (cons lista list_o))
  60.   )
  61.   (reverse list_o)
  62. )

测试:

  1. 命令: (setq nlist '((1 2 3) (3 3) (3 1 2 4) (2 1 3) (3 3 3) (2 1 3 4) (2 2) (1 2) (1 2 3 4 5)))
  2. ((1 2 3) (3 3) (3 1 2 4) (2 1 3) (3 3 3) (2 1 3 4) (2 2) (1 2) (1 2 3 4 5))

  3. 命令: (sort_list nlist '<)
  4. ((1 2) (1 2 3) (1 2 3 4 5) (2 1 3) (2 1 3 4) (2 2) (3 1 2 4) (3 3) (3 3 3))

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

使用道具 举报

发表于 2004-2-7 21:41:30 | 显示全部楼层
我的办法:

(defun sort_list (nlist)
  (vl-sort nlist
           '(lambda (a b)
              (while (and a (equal (car a) (car b))) (setq a (cdr a) b (cdr b)))
              (cond
                ((and a b) (< (car a) (car b)))
                (a nil)
                (b T)
              )
            )
  )
)

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

使用道具 举报

发表于 2004-2-11 17:39:44 | 显示全部楼层
测测这个:

  1.   [FONT=courier new]
  2. (defun c:tt ()
  3.   (setq a '((1 2 3 5) (4 2 4 5 9) (1 2 3 4) (5 2 5 1 2)(1 2 5) (1 1 3) (1 3 4) (1 7 6) (2 2 3)  ))
  4.   (setq len 0)
  5.   (foreach n a (if(> (length n) len)(setq len (length n))))
  6.   (setq n len)
  7.   (repeat len
  8.     (setq n (1- n))
  9.     (setq a (vl-sort a '(lambda (s1 s2) (< (nth n s1) (nth n s2)))))
  10.   )
  11.   (foreach n a (print n))(princ)
  12. )
  13.   [/FONT]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 6530个

财富等级: 富甲天下

发表于 2004-2-11 19:19:25 | 显示全部楼层
最初由 wkai 发布
[B]测测这个:
  
(defun c:tt ()
  (setq a '((1 2 3 5) (4 2 4 5 9) (1 2 3 4) (5 2 5 1 2)(1 2 5) (1 1 3) (1 3 4) (1 7 6) (2 2 3)  ))
  (setq len 0)
  (foreach n a (if(> (lengt... [/B]


将子表原子从后向前依次排序,太巧妙了!按wkai的程序归纳出通用代码:

  1. (defun sort_list (a / n)
  2.   (repeat (setq n (apply 'max (mapcar 'length a)))
  3.     (setq n (1- n))
  4.     (setq a (vl-sort a '(lambda (s1 s2) (< (nth n s1) (nth n s2)))))
  5.   )
  6. ;  (foreach n a (print n))(princ)
  7. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-9-27 00:13 , Processed in 0.377121 second(s), 42 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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