全球FlexSim系统仿真中文论坛

搜索
查看: 4398|回复: 1
打印 上一主题 下一主题

临时实体排列顺序代码解析

[复制链接]
跳转到指定楼层
1#
zorsite 发表于 2016-5-24 10:48:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zorsite 于 2016-5-24 10:59 编辑 & k4 F* p0 F& ]* i) N

. t# ~5 b$ S8 f0 G+ x此段代码为系统自带,注释如有错误敬请指出。排序的标准可以是临时实体类型,也可以临时实体标签值或其他。9 U6 y! [3 B6 z3 L4 U5 O! I7 \/ f
本例是对暂存区内的临时实体按照临时实体上名为remaintime的标签值降序排列。
  1. /**按标签值降序排列临时实体*/9 J, B0 D9 G  J' B
  2. treenode item = param(1);! @8 K- y/ O' Z( |3 T8 e5 ^( |
  3. treenode current = ownerobject(c);
    , k# Q$ ~) B2 C# o: l5 v$ _
  4. int port = param(2);2 M* L5 b# E- c% _$ i+ g. u
  5. ' |- d1 q# _  N
  6. int Ascending = 1;
    ( o' A6 V! w- [% o, x
  7. int Descending = 2;% \& f* I7 U; f7 ]9 D1 \" B) b
  8. int order = Descending;: m% n3 ?% C' c& D. r; O

  9. 5 @) C* l( x3 P! [" }0 k
  10. double currentlabel = getlabel(item, "remaintime");
    / |2 R" C3 m  h+ C
  11. int maxrank = 1;5 C' \. m9 G# m% M1 R& Z; T7 h
  12. //假设新进入的(当前临时实体)默认排在队列的第一位。
    1 p4 F2 R. i5 v5 S9 {$ ~' }
  13. //接下来的代码对各个临时实体的标签值进行比较,从新确定新进入的(当前临时实体)的排序。6 g; F/ H- I0 _/ s
  14. for (int i = 1; i <= content(current); i++) {
    , T( J9 }, N, n7 }8 _) k( z" f
  15.         treenode cmpareitem = rank(current, i);
    ; b7 l! p) {7 L; u; o
  16.         double comparelabel = getlabel(cmpareitem, "remaintime");
    2 q' h' c% ]" g9 v9 M9 C
  17.         if (order == Ascending)
    8 z1 H' |/ k& z+ ~9 S% I4 h' y
  18.               {  if (comparelabel > currentlabel)        break;}
    * N: z" D6 m3 y. L; R( d
  19.         //如果是升序排列(从小到大),对比每一个临时实体的标签值,如果大于当前进入的临时实体标签值* B' |4 T- S5 Q4 I8 K
  20.          //那么当前临时实体应该排在前面,不改变maxrank的值,直接跳出当前for循环
    - T) |  C* t" l0 i
  21.          //如果小于当前标签值,表明当前临时实体标签值比较大,应该排在后面,执行maxrank++7 ^3 Z, h& S2 g! T& R& V
  22.         else if (comparelabel < currentlabel)  break;* H# w) w) u# N: ?1 w
  23.         //如果是降序排列,只需要改变比较的方向,其他原理相同。
    * ^- I% z; ?: U0 z! O3 ]
  24.         maxrank++;3 S: S2 P' f2 e0 `! y# A2 y$ k
  25. }* |0 S+ I+ y9 n; O/ T. G7 D
  26. setrank(item,min(maxrank, content(current)));
    . h* z& ?) Z% }4 ~8 ~& F6 s8 I8 g
复制代码
注意break的用途。break仅作用于for、while、switch语句。作用是跳出for循环,不再执行for循环,转而执行for循环之后的语句。
: ]& M* W4 E8 F( R( n因为每一个临时实体进入暂存区都会执行该段代码,所以每一次有新的临时实体进入暂存区时,暂存区原有的临时实体都是按顺序排好的。这也就意味着,不用遍历所有的临时实体。* b# p3 w; g8 x" z! c
举例来说,如果是降序排列,已按照9,8,6,3,2,1排好了顺序,现新进入一个标签值为5的临时实体,当for循环到第4次的时候,获取到的标签值comparelabel=3,currentlabel=5,comparelabel < currentlabel返回true,执行break语句跳出for循环,后面的2和1就不用比较了。
% m, K; b4 g4 P  S  R: {. ~: a& d而for循环了3次,maxrank的值为4,新进入的临时实体排在第4位。
2#
慧娴亚伦 发表于 2016-5-24 16:30:59 | 只看该作者
这个是典型的冒泡排序,属于常见的排序算法。. G4 w0 [# g$ E0 q! R6 P: q
感谢加老师分享。! e& Y" t4 v- n
有兴趣研究排序算法的朋友,也可以利用FlexSim来完成对排序算法的检验
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|手机版|Archiver|全球FlexSim系统仿真中文论坛 ( 京ICP备14043114号-2 )

GMT+8, 2025-9-6 12:35 , Processed in 0.084293 second(s), 13 queries .

Powered by Discuz! X3.3© 2001-2013 Comsenz Inc.

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