全球FlexSim系统仿真中文论坛

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

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

[复制链接]
跳转到指定楼层
1#
zorsite 发表于 2016-5-24 10:48:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zorsite 于 2016-5-24 10:59 编辑 " @: R3 f' A2 ]& S

' E3 ?2 q- O, F2 \( j此段代码为系统自带,注释如有错误敬请指出。排序的标准可以是临时实体类型,也可以临时实体标签值或其他。4 |, u9 d; J1 f' y. f
本例是对暂存区内的临时实体按照临时实体上名为remaintime的标签值降序排列。
  1. /**按标签值降序排列临时实体*/
    " e% H" N2 k7 T# N" \( s
  2. treenode item = param(1);: j4 v$ s. s- }7 Y) Z5 _* k
  3. treenode current = ownerobject(c);% R3 Y) M$ o9 }  n+ ]5 D; ^! L
  4. int port = param(2);
    9 u( |: |9 R7 F0 d" D1 E$ q3 m# Q
  5. : O7 e/ I9 o- Z/ ?- K# D; @8 @2 |
  6. int Ascending = 1;$ [( t) A# `  j' F
  7. int Descending = 2;
    + `! W' M5 N. F4 x1 d! ^9 _% F
  8. int order = Descending;9 @9 R$ W; W6 X5 q* B
  9.   q/ ~" Z* z: b9 v- V
  10. double currentlabel = getlabel(item, "remaintime");* `& ~) U4 R0 |2 ]% I( w2 o% V* g
  11. int maxrank = 1;5 l; a5 k: D/ J3 j2 v7 \& I: Y4 P+ u
  12. //假设新进入的(当前临时实体)默认排在队列的第一位。
    , F# W7 }6 U! e* o! R9 c3 r5 P4 h
  13. //接下来的代码对各个临时实体的标签值进行比较,从新确定新进入的(当前临时实体)的排序。
    ! \) {/ |  Q3 ^9 u, F% \
  14. for (int i = 1; i <= content(current); i++) {
    $ T9 P$ u1 G: o4 U
  15.         treenode cmpareitem = rank(current, i);5 d4 E! G! x7 D# ?
  16.         double comparelabel = getlabel(cmpareitem, "remaintime");
      v" f9 s4 s- m& W0 j) h
  17.         if (order == Ascending) 3 r( r. K% n* H" f3 R# l4 Y6 R1 h
  18.               {  if (comparelabel > currentlabel)        break;}$ j" S5 C3 T8 l6 H
  19.         //如果是升序排列(从小到大),对比每一个临时实体的标签值,如果大于当前进入的临时实体标签值
    ( w! @" [3 c/ n) F* M
  20.          //那么当前临时实体应该排在前面,不改变maxrank的值,直接跳出当前for循环
    : n6 f8 U" ]4 |, l$ ]
  21.          //如果小于当前标签值,表明当前临时实体标签值比较大,应该排在后面,执行maxrank++6 k+ n% g1 p% z. d! F% q
  22.         else if (comparelabel < currentlabel)  break;2 i. U! w; ~3 s6 X4 C/ H
  23.         //如果是降序排列,只需要改变比较的方向,其他原理相同。
      o; n* ^* I0 [5 ?% t7 m
  24.         maxrank++;
    6 }7 m$ X& f3 }
  25. }
    5 A! X, h" {. N% Z# M$ M  {. _/ @
  26. setrank(item,min(maxrank, content(current)));
    9 f: B3 r) t5 Q# ^/ Q& \. X
复制代码
注意break的用途。break仅作用于for、while、switch语句。作用是跳出for循环,不再执行for循环,转而执行for循环之后的语句。' C# J& T9 E9 M' b1 Z% Y) a
因为每一个临时实体进入暂存区都会执行该段代码,所以每一次有新的临时实体进入暂存区时,暂存区原有的临时实体都是按顺序排好的。这也就意味着,不用遍历所有的临时实体。0 z: E* d0 L% k7 U  ?0 _
举例来说,如果是降序排列,已按照9,8,6,3,2,1排好了顺序,现新进入一个标签值为5的临时实体,当for循环到第4次的时候,获取到的标签值comparelabel=3,currentlabel=5,comparelabel < currentlabel返回true,执行break语句跳出for循环,后面的2和1就不用比较了。- H, Z3 k* C3 Y7 k7 r' o
而for循环了3次,maxrank的值为4,新进入的临时实体排在第4位。
2#
慧娴亚伦 发表于 2016-5-24 16:30:59 | 只看该作者
这个是典型的冒泡排序,属于常见的排序算法。
8 M4 H' F- C0 v0 H) C感谢加老师分享。* H! |, C6 b8 [! |
有兴趣研究排序算法的朋友,也可以利用FlexSim来完成对排序算法的检验
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-7-2 04:57 , Processed in 0.059904 second(s), 13 queries .

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

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