全球FlexSim系统仿真中文论坛

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

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

[复制链接]
跳转到指定楼层
1#
zorsite 发表于 2016-5-24 10:48:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zorsite 于 2016-5-24 10:59 编辑 6 V1 \6 B" b: `) _% m- J; L: l
" p3 D# A$ E1 _( B$ \
此段代码为系统自带,注释如有错误敬请指出。排序的标准可以是临时实体类型,也可以临时实体标签值或其他。
8 R1 t5 u5 N1 ]! H本例是对暂存区内的临时实体按照临时实体上名为remaintime的标签值降序排列。
  1. /**按标签值降序排列临时实体*/' x' K5 R& k* U+ N8 {1 w  l: M
  2. treenode item = param(1);
    5 B2 d- `/ @1 @) n
  3. treenode current = ownerobject(c);5 |% d8 T; |; A! F
  4. int port = param(2);
    . p4 ^& [" e2 Z; q/ P

  5.   I5 j9 v9 [7 J! @% Y
  6. int Ascending = 1;
    6 D, h0 O0 y& i$ \- C% K7 v
  7. int Descending = 2;
    2 A% U8 p( _4 p: A& `  U
  8. int order = Descending;+ x7 F* P% D$ S, Q+ x
  9. 9 P' e3 R1 w8 N- O2 A: I
  10. double currentlabel = getlabel(item, "remaintime");
    6 _# e3 a" I6 u
  11. int maxrank = 1;
    $ Y! X* y' |) e) i5 `. o6 n9 n
  12. //假设新进入的(当前临时实体)默认排在队列的第一位。9 q* m: b9 G; @+ J5 ~* S( U# ]
  13. //接下来的代码对各个临时实体的标签值进行比较,从新确定新进入的(当前临时实体)的排序。
    % D8 s# |& @9 }9 j. T& j+ a
  14. for (int i = 1; i <= content(current); i++) {
    ; }8 {) j7 p8 k  K5 I
  15.         treenode cmpareitem = rank(current, i);
    + t- A) x9 |, q" M2 Q) }# f
  16.         double comparelabel = getlabel(cmpareitem, "remaintime");
    1 ?7 \/ {0 n/ A) |) }, N8 W
  17.         if (order == Ascending)
    - H, o' p. |" ?# F
  18.               {  if (comparelabel > currentlabel)        break;}
    * c' Z. k# c% `5 j- O: @
  19.         //如果是升序排列(从小到大),对比每一个临时实体的标签值,如果大于当前进入的临时实体标签值$ I( _1 U- _8 d2 b& B2 p7 @
  20.          //那么当前临时实体应该排在前面,不改变maxrank的值,直接跳出当前for循环
    7 A0 |. T$ z7 }  t# |
  21.          //如果小于当前标签值,表明当前临时实体标签值比较大,应该排在后面,执行maxrank++6 _! N# v! [0 A$ M3 C" l1 s
  22.         else if (comparelabel < currentlabel)  break;8 r6 k& V, {1 I) o: K3 N( {0 C! l
  23.         //如果是降序排列,只需要改变比较的方向,其他原理相同。' m' g7 u) o" N0 X; `+ @! N! u4 c
  24.         maxrank++;) F- u% d5 u$ D6 b
  25. }
    : x5 ?" t7 S$ @5 R* \) A1 `% R
  26. setrank(item,min(maxrank, content(current)));
    2 Q: c1 N4 h" x; j6 O2 o1 }3 Y2 }
复制代码
注意break的用途。break仅作用于for、while、switch语句。作用是跳出for循环,不再执行for循环,转而执行for循环之后的语句。& k4 m% b0 e+ X& Y" E2 y; {
因为每一个临时实体进入暂存区都会执行该段代码,所以每一次有新的临时实体进入暂存区时,暂存区原有的临时实体都是按顺序排好的。这也就意味着,不用遍历所有的临时实体。
* q4 R( e* r  h: S% K4 s举例来说,如果是降序排列,已按照9,8,6,3,2,1排好了顺序,现新进入一个标签值为5的临时实体,当for循环到第4次的时候,获取到的标签值comparelabel=3,currentlabel=5,comparelabel < currentlabel返回true,执行break语句跳出for循环,后面的2和1就不用比较了。* g2 e$ r* F5 l) D
而for循环了3次,maxrank的值为4,新进入的临时实体排在第4位。
2#
慧娴亚伦 发表于 2016-5-24 16:30:59 | 只看该作者
这个是典型的冒泡排序,属于常见的排序算法。. L- }+ y* f  v/ m9 J- ]6 A1 j. i
感谢加老师分享。5 R6 ~& x$ U% z0 P
有兴趣研究排序算法的朋友,也可以利用FlexSim来完成对排序算法的检验
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-6-30 15:38 , Processed in 0.083027 second(s), 13 queries .

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

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