全球FlexSim系统仿真中文论坛

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

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

[复制链接]
跳转到指定楼层
1#
zorsite 发表于 2016-5-24 10:48:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zorsite 于 2016-5-24 10:59 编辑 ; g# t3 \5 F8 M! q8 M- f' h0 D+ }4 ]

) f3 p% G, V4 m8 U+ A  g此段代码为系统自带,注释如有错误敬请指出。排序的标准可以是临时实体类型,也可以临时实体标签值或其他。( a3 G; ~' H. f  w! u; D
本例是对暂存区内的临时实体按照临时实体上名为remaintime的标签值降序排列。
  1. /**按标签值降序排列临时实体*/
    8 f% o7 w$ y/ [/ v, q
  2. treenode item = param(1);* Q2 S; Y0 u* ^4 C
  3. treenode current = ownerobject(c);2 m, a( o, K3 J0 U2 g
  4. int port = param(2);7 {. J$ S" h! }) A6 v

  5. ! O& [2 }* ~1 p% Y$ t4 X; M" h  g. f
  6. int Ascending = 1;8 Z9 c, Y$ F# e$ F: h# ^
  7. int Descending = 2;3 K7 R( _. ]) v8 Z& E8 @$ o
  8. int order = Descending;
    8 u; V( m0 j, n+ R8 F3 j: l% \/ X

  9. - ~+ g0 V" _2 f9 S
  10. double currentlabel = getlabel(item, "remaintime");( c( r8 y7 Z, @/ V
  11. int maxrank = 1;
    . D  H! d! v3 n- P* w
  12. //假设新进入的(当前临时实体)默认排在队列的第一位。% X& [5 L6 N+ s( I# V
  13. //接下来的代码对各个临时实体的标签值进行比较,从新确定新进入的(当前临时实体)的排序。% S/ v+ j4 {0 i7 u" p
  14. for (int i = 1; i <= content(current); i++) {
    7 Q: a8 W; ?! m/ i. N
  15.         treenode cmpareitem = rank(current, i);
    , n5 R6 g- }( {6 x3 @6 g
  16.         double comparelabel = getlabel(cmpareitem, "remaintime");
    : v  f3 }% g  A
  17.         if (order == Ascending)
    : ?) K' V% }! N# o/ i
  18.               {  if (comparelabel > currentlabel)        break;}
    $ r. C6 B2 y: ~- ?- `. E% y
  19.         //如果是升序排列(从小到大),对比每一个临时实体的标签值,如果大于当前进入的临时实体标签值  B5 [. z5 Z9 D, A- s
  20.          //那么当前临时实体应该排在前面,不改变maxrank的值,直接跳出当前for循环
    % d6 b/ d1 ?8 u/ B. F2 |  J) A
  21.          //如果小于当前标签值,表明当前临时实体标签值比较大,应该排在后面,执行maxrank++
    $ c, ?( u$ S2 J, T
  22.         else if (comparelabel < currentlabel)  break;1 V0 Q! h0 {0 v. z; ^
  23.         //如果是降序排列,只需要改变比较的方向,其他原理相同。5 e$ O, G, Q& @/ v, I
  24.         maxrank++;0 h4 \! k$ a$ l5 W3 p. L% K/ D3 W
  25. }
    : k! o1 b' `9 f" G! Y4 S
  26. setrank(item,min(maxrank, content(current)));
    6 E; |. h% W2 r; n: K$ G6 T
复制代码
注意break的用途。break仅作用于for、while、switch语句。作用是跳出for循环,不再执行for循环,转而执行for循环之后的语句。) G4 Z4 Y4 u, ?, H) h$ s" w
因为每一个临时实体进入暂存区都会执行该段代码,所以每一次有新的临时实体进入暂存区时,暂存区原有的临时实体都是按顺序排好的。这也就意味着,不用遍历所有的临时实体。
+ j( J2 }6 N* S5 ~. F9 e举例来说,如果是降序排列,已按照9,8,6,3,2,1排好了顺序,现新进入一个标签值为5的临时实体,当for循环到第4次的时候,获取到的标签值comparelabel=3,currentlabel=5,comparelabel < currentlabel返回true,执行break语句跳出for循环,后面的2和1就不用比较了。
- o( U/ \; Q* ^" D: p6 K: Z1 n而for循环了3次,maxrank的值为4,新进入的临时实体排在第4位。
2#
慧娴亚伦 发表于 2016-5-24 16:30:59 | 只看该作者
这个是典型的冒泡排序,属于常见的排序算法。
$ y( K5 |, v- `, V6 w. F+ g. J感谢加老师分享。
' L, B: W9 w" f! m' U有兴趣研究排序算法的朋友,也可以利用FlexSim来完成对排序算法的检验
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-7-2 20:12 , Processed in 0.062277 second(s), 13 queries .

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

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