全球FlexSim系统仿真中文论坛

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

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

[复制链接]
跳转到指定楼层
1#
zorsite 发表于 2016-5-24 10:48:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zorsite 于 2016-5-24 10:59 编辑
$ x" b$ Z: R6 [: Q9 t1 k* k( @7 v) U) z+ b0 Y1 g
此段代码为系统自带,注释如有错误敬请指出。排序的标准可以是临时实体类型,也可以临时实体标签值或其他。$ l! f- T* d3 z/ f
本例是对暂存区内的临时实体按照临时实体上名为remaintime的标签值降序排列。
  1. /**按标签值降序排列临时实体*/
    / H1 l7 l- T) m$ u
  2. treenode item = param(1);
    4 l/ C+ d0 x1 f8 b  s/ i9 ?6 i
  3. treenode current = ownerobject(c);
    ! x9 U4 O- A* d  t2 Q
  4. int port = param(2);# ?8 @+ [. T' s: Q: K
  5. ( @, u& ^0 w+ ?% t$ W
  6. int Ascending = 1;
    . ~- T4 g7 \+ g6 o% b
  7. int Descending = 2;
    " _4 ?' r: w* ~8 }
  8. int order = Descending;
    9 V. u; H$ d9 ~+ F; [1 D3 r( }2 W

  9. 2 l# A% b5 [0 U$ C% j/ W
  10. double currentlabel = getlabel(item, "remaintime");% {3 k. d- s% ?; g2 ]/ k& M! L
  11. int maxrank = 1;
    + Y4 Z  G% o& Q6 K( O( C: i2 h, L9 j
  12. //假设新进入的(当前临时实体)默认排在队列的第一位。3 z! I; r( p/ N( [
  13. //接下来的代码对各个临时实体的标签值进行比较,从新确定新进入的(当前临时实体)的排序。
    ! x, t6 l2 d" O0 J" D* V  w
  14. for (int i = 1; i <= content(current); i++) {
    ) a$ X$ _3 p7 T( S
  15.         treenode cmpareitem = rank(current, i);
    " B  U. A3 Y3 J8 ]3 ^" X/ c
  16.         double comparelabel = getlabel(cmpareitem, "remaintime");
    : j1 P7 o5 p/ F. e) t6 g
  17.         if (order == Ascending)
    ! }2 ~* u" T% m/ ^$ P
  18.               {  if (comparelabel > currentlabel)        break;}
    8 z  {: f& O1 }
  19.         //如果是升序排列(从小到大),对比每一个临时实体的标签值,如果大于当前进入的临时实体标签值
    ) Z4 e( ~- A& c$ Y
  20.          //那么当前临时实体应该排在前面,不改变maxrank的值,直接跳出当前for循环3 ~% ]0 l$ l7 P, x; ]! [4 p' \; l
  21.          //如果小于当前标签值,表明当前临时实体标签值比较大,应该排在后面,执行maxrank++0 l; I% m) l7 V1 V0 S0 h. V
  22.         else if (comparelabel < currentlabel)  break;
    ; ^: ]2 s, L( b9 ~! B% \  \
  23.         //如果是降序排列,只需要改变比较的方向,其他原理相同。& K( u/ B# b5 u! I  ]
  24.         maxrank++;0 {4 I/ w! t! ^! ^8 V/ T( L
  25. }
    2 B7 Q+ e6 q; ?$ A' z! a/ O
  26. setrank(item,min(maxrank, content(current)));
    ' J+ ]  l. U. ~3 U7 C
复制代码
注意break的用途。break仅作用于for、while、switch语句。作用是跳出for循环,不再执行for循环,转而执行for循环之后的语句。
6 r$ w4 R- A% f. J( ^6 g* m因为每一个临时实体进入暂存区都会执行该段代码,所以每一次有新的临时实体进入暂存区时,暂存区原有的临时实体都是按顺序排好的。这也就意味着,不用遍历所有的临时实体。% P* Z' x+ s, B; g( c
举例来说,如果是降序排列,已按照9,8,6,3,2,1排好了顺序,现新进入一个标签值为5的临时实体,当for循环到第4次的时候,获取到的标签值comparelabel=3,currentlabel=5,comparelabel < currentlabel返回true,执行break语句跳出for循环,后面的2和1就不用比较了。7 P4 j% }* e! @0 R% ~5 C1 N
而for循环了3次,maxrank的值为4,新进入的临时实体排在第4位。
2#
慧娴亚伦 发表于 2016-5-24 16:30:59 | 只看该作者
这个是典型的冒泡排序,属于常见的排序算法。+ \5 e* i3 T0 c, w4 I2 ^5 O; q
感谢加老师分享。8 I1 P  s: p5 w1 w6 ~
有兴趣研究排序算法的朋友,也可以利用FlexSim来完成对排序算法的检验
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-6-30 17:51 , Processed in 0.074280 second(s), 13 queries .

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

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