全球FlexSim系统仿真中文论坛

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

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

[复制链接]
跳转到指定楼层
1#
zorsite 发表于 2016-5-24 10:48:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zorsite 于 2016-5-24 10:59 编辑
7 [7 o9 @$ J, Y
, q; b1 m4 C8 q, u) h1 {( l此段代码为系统自带,注释如有错误敬请指出。排序的标准可以是临时实体类型,也可以临时实体标签值或其他。
" E! r+ e/ g" X8 @+ W0 {) G本例是对暂存区内的临时实体按照临时实体上名为remaintime的标签值降序排列。
  1. /**按标签值降序排列临时实体*/- _/ D3 C7 }* P5 \6 V. p' Q4 c
  2. treenode item = param(1);
    $ s8 d. f1 O6 Z* b0 S7 i+ z
  3. treenode current = ownerobject(c);
    6 X. r. f5 W* y! b( h
  4. int port = param(2);
    / y+ `- e6 l/ Q8 H: Z
  5. % x$ r. x: e8 j6 Y8 K2 W- d) q
  6. int Ascending = 1;$ p8 j+ p9 ^/ W( K7 e1 e3 e- B
  7. int Descending = 2;
    - }* v7 q' g5 i; J: Y4 U
  8. int order = Descending;
      E% W6 g# }9 Y% ~8 e% c
  9. ! z: A2 m6 [! ]) N0 Y
  10. double currentlabel = getlabel(item, "remaintime");
    : `0 J, |4 W( \0 G" ^; X
  11. int maxrank = 1;
    ; @; Y5 o. C" M+ w/ f, T5 q
  12. //假设新进入的(当前临时实体)默认排在队列的第一位。( A5 D+ Q4 H2 K- q' f) w% f. F
  13. //接下来的代码对各个临时实体的标签值进行比较,从新确定新进入的(当前临时实体)的排序。
    3 G; M6 {% q) M+ l
  14. for (int i = 1; i <= content(current); i++) {
    / l5 X! s& P. F# J/ E2 [& L" F! k$ V
  15.         treenode cmpareitem = rank(current, i);5 O  ], p2 T; K3 G% v( y
  16.         double comparelabel = getlabel(cmpareitem, "remaintime");2 H2 L, x$ n3 P( J
  17.         if (order == Ascending) 1 Q1 H, o1 L: k$ ]4 M4 Y
  18.               {  if (comparelabel > currentlabel)        break;}" V& |, `6 [# Q: K3 c3 C' U: Q9 q
  19.         //如果是升序排列(从小到大),对比每一个临时实体的标签值,如果大于当前进入的临时实体标签值3 S- H7 @5 ]+ r' I; f3 }  d
  20.          //那么当前临时实体应该排在前面,不改变maxrank的值,直接跳出当前for循环
    + p# l9 U! D" j: U+ S' V
  21.          //如果小于当前标签值,表明当前临时实体标签值比较大,应该排在后面,执行maxrank++
    / _: L& e/ |1 A9 K
  22.         else if (comparelabel < currentlabel)  break;$ U5 D7 s1 i% d) s
  23.         //如果是降序排列,只需要改变比较的方向,其他原理相同。
    3 y# R! A4 T4 E6 g* `6 x" @6 _3 c
  24.         maxrank++;
    $ X0 i4 q  I' _5 C
  25. }
    * _5 d4 @* W1 ]5 @* m2 |
  26. setrank(item,min(maxrank, content(current)));
    1 L) L# ?9 ^! X8 i: I- m
复制代码
注意break的用途。break仅作用于for、while、switch语句。作用是跳出for循环,不再执行for循环,转而执行for循环之后的语句。* G- l& j% J! z' w& v. Y& M+ {# i
因为每一个临时实体进入暂存区都会执行该段代码,所以每一次有新的临时实体进入暂存区时,暂存区原有的临时实体都是按顺序排好的。这也就意味着,不用遍历所有的临时实体。
3 _7 ~7 i! M2 V举例来说,如果是降序排列,已按照9,8,6,3,2,1排好了顺序,现新进入一个标签值为5的临时实体,当for循环到第4次的时候,获取到的标签值comparelabel=3,currentlabel=5,comparelabel < currentlabel返回true,执行break语句跳出for循环,后面的2和1就不用比较了。. ], g6 a  X. h3 c2 o' s! l& n
而for循环了3次,maxrank的值为4,新进入的临时实体排在第4位。
2#
慧娴亚伦 发表于 2016-5-24 16:30:59 | 只看该作者
这个是典型的冒泡排序,属于常见的排序算法。
4 U6 o# t! k& v6 ^: W' g1 d感谢加老师分享。. O2 I1 y: @  K/ l% D
有兴趣研究排序算法的朋友,也可以利用FlexSim来完成对排序算法的检验
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-9-6 14:38 , Processed in 0.087303 second(s), 13 queries .

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

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