全球FlexSim系统仿真中文论坛

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

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

[复制链接]
跳转到指定楼层
1#
zorsite 发表于 2016-5-24 10:48:08 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
本帖最后由 zorsite 于 2016-5-24 10:59 编辑
) D! F( ^$ S  S9 L; I/ r, R& J% E0 g3 z! j4 x+ I% l% g
此段代码为系统自带,注释如有错误敬请指出。排序的标准可以是临时实体类型,也可以临时实体标签值或其他。
: t5 r3 B, |3 L) X/ w5 k9 W本例是对暂存区内的临时实体按照临时实体上名为remaintime的标签值降序排列。
  1. /**按标签值降序排列临时实体*/' s; g* X' X; P* T
  2. treenode item = param(1);
    $ _. \. Q5 q( I9 v  ~- C
  3. treenode current = ownerobject(c);9 R0 O- _$ a  ~5 z
  4. int port = param(2);+ P, \7 _0 a: |' b# I1 n  P$ _; @

  5. 9 r1 r( N5 N' A- N
  6. int Ascending = 1;
    . h0 y1 I% s; M( W2 q, F
  7. int Descending = 2;
    6 ]- I# f% g" _7 ^) T7 g
  8. int order = Descending;
    ; d) r8 d( g8 {( z/ r7 @' b
  9. : a4 k9 B* H) ?0 T( N
  10. double currentlabel = getlabel(item, "remaintime");& g1 {7 H8 P/ h" H/ M7 _# a1 s
  11. int maxrank = 1;7 R5 i8 H( w$ }+ r0 y" D
  12. //假设新进入的(当前临时实体)默认排在队列的第一位。9 n/ R) S0 D3 J
  13. //接下来的代码对各个临时实体的标签值进行比较,从新确定新进入的(当前临时实体)的排序。9 y# J4 V) |- y0 ^3 P8 b' g# j! b
  14. for (int i = 1; i <= content(current); i++) {
    5 g  w' j- C5 z% ^! }/ u: l
  15.         treenode cmpareitem = rank(current, i);" x. k7 i; n9 x
  16.         double comparelabel = getlabel(cmpareitem, "remaintime");3 N) U: y. \4 s, x: c& w* K* @
  17.         if (order == Ascending) ' D$ o/ p6 H2 f& Q8 a5 \$ {
  18.               {  if (comparelabel > currentlabel)        break;}
    + ~1 h( G3 V- }
  19.         //如果是升序排列(从小到大),对比每一个临时实体的标签值,如果大于当前进入的临时实体标签值& c, W' A( F0 q; o8 ^
  20.          //那么当前临时实体应该排在前面,不改变maxrank的值,直接跳出当前for循环! [: e( v9 V" z8 E, H
  21.          //如果小于当前标签值,表明当前临时实体标签值比较大,应该排在后面,执行maxrank++
    * _2 t; p$ ^. `0 v3 m1 v
  22.         else if (comparelabel < currentlabel)  break;! N4 m8 G) r* e2 ?3 k+ p/ k5 i- z
  23.         //如果是降序排列,只需要改变比较的方向,其他原理相同。
    0 j0 D- l& r: l- n+ o
  24.         maxrank++;
    & m+ x- ?8 A- i; J& K( h( B6 h( q
  25. }
    * |' P  o5 h: X) O& j$ Z3 Z7 h1 y
  26. setrank(item,min(maxrank, content(current)));; C0 t& v) W! @9 v3 ]1 J8 Q
复制代码
注意break的用途。break仅作用于for、while、switch语句。作用是跳出for循环,不再执行for循环,转而执行for循环之后的语句。
. d; h" V: z# H" h7 t因为每一个临时实体进入暂存区都会执行该段代码,所以每一次有新的临时实体进入暂存区时,暂存区原有的临时实体都是按顺序排好的。这也就意味着,不用遍历所有的临时实体。' @' z  N$ Q7 h" j0 z/ I
举例来说,如果是降序排列,已按照9,8,6,3,2,1排好了顺序,现新进入一个标签值为5的临时实体,当for循环到第4次的时候,获取到的标签值comparelabel=3,currentlabel=5,comparelabel < currentlabel返回true,执行break语句跳出for循环,后面的2和1就不用比较了。
5 J5 C$ A# A; C4 W# V( L* [5 r而for循环了3次,maxrank的值为4,新进入的临时实体排在第4位。
2#
慧娴亚伦 发表于 2016-5-24 16:30:59 | 只看该作者
这个是典型的冒泡排序,属于常见的排序算法。, @! n$ f- o8 |& p$ w9 d7 Z
感谢加老师分享。
5 [. _6 ]8 t, r! q有兴趣研究排序算法的朋友,也可以利用FlexSim来完成对排序算法的检验
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-6-30 14:23 , Processed in 0.059475 second(s), 14 queries .

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

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